Compare commits
1 Commits
fix/531
...
fix/683-wo
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b430114be |
263
genomes/wolf/GENOME.md
Normal file
263
genomes/wolf/GENOME.md
Normal file
@@ -0,0 +1,263 @@
|
||||
# GENOME.md — Wolf (Timmy_Foundation/wolf)
|
||||
|
||||
> Codebase Genome v1.0 | Generated 2026-04-14 | Repo 16/16
|
||||
|
||||
## Project Overview
|
||||
|
||||
**Wolf** is a multi-model evaluation engine for sovereign AI fleets. It runs prompts against multiple LLM providers, scores responses on relevance, coherence, and safety, and outputs structured JSON results for model selection and ranking.
|
||||
|
||||
**Core principle:** agents work, PRs prove it, CI judges it.
|
||||
|
||||
**Status:** v1.0.0 — production-ready for prompt evaluation. Legacy PR evaluation module retained for backward compatibility.
|
||||
|
||||
## Architecture
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
CLI[cli.py] --> Config[config.py]
|
||||
CLI --> TaskGen[task.py]
|
||||
CLI --> Runner[runner.py]
|
||||
CLI --> Evaluator[evaluator.py]
|
||||
CLI --> Leaderboard[leaderboard.py]
|
||||
CLI --> Gitea[gitea.py]
|
||||
|
||||
Runner --> Models[models.py]
|
||||
Runner --> Gitea
|
||||
Evaluator --> Models
|
||||
|
||||
TaskGen --> Gitea
|
||||
Leaderboard --> |leaderboard.json| FS[(File System)]
|
||||
Config --> |wolf-config.yaml| FS
|
||||
|
||||
Models --> OpenRouter[OpenRouter API]
|
||||
Models --> Groq[Groq API]
|
||||
Models --> Ollama[Ollama Local]
|
||||
Models --> OpenAI[OpenAI API]
|
||||
Models --> Anthropic[Anthropic API]
|
||||
|
||||
Runner --> |branch + commit| Gitea
|
||||
Evaluator --> |score results| Leaderboard
|
||||
```
|
||||
|
||||
## Entry Points
|
||||
|
||||
| Entry Point | Command | Purpose |
|
||||
|-------------|---------|---------|
|
||||
| `wolf/cli.py` | `python3 -m wolf.cli --run` | Main CLI: run tasks, evaluate PRs, show leaderboard |
|
||||
| `wolf/runner.py` | `python3 -m wolf.runner --prompts p.json --models m.json` | Standalone prompt evaluation runner |
|
||||
| `wolf/__init__.py` | `import wolf` | Package init, version metadata |
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Prompt Evaluation Pipeline (Primary)
|
||||
|
||||
```
|
||||
prompts.json + models.json (or wolf-config.yaml)
|
||||
│
|
||||
▼
|
||||
PromptEvaluator.evaluate()
|
||||
│
|
||||
├─ For each (prompt, model) pair:
|
||||
│ ├─ ModelClient.generate(prompt) → response text
|
||||
│ ├─ ResponseScorer.score(response, prompt)
|
||||
│ │ ├─ score_relevance() (0.40 weight)
|
||||
│ │ ├─ score_coherence() (0.35 weight)
|
||||
│ │ └─ score_safety() (0.25 weight)
|
||||
│ └─ EvaluationResult (prompt, model, scores, latency, error)
|
||||
│
|
||||
▼
|
||||
evaluate_and_serialize() → JSON output
|
||||
│
|
||||
├─ model_summaries (per-model averages)
|
||||
└─ results[] (per-evaluation details)
|
||||
```
|
||||
|
||||
### Task Assignment Pipeline (Legacy)
|
||||
|
||||
```
|
||||
Gitea Issues → TaskGenerator → AgentRunner
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
Fetch tasks Assign models Execute + PR
|
||||
from issues from config via Gitea API
|
||||
```
|
||||
|
||||
## Key Abstractions
|
||||
|
||||
| Class | Module | Purpose |
|
||||
|-------|--------|---------|
|
||||
| `PromptEntry` | evaluator.py | Single prompt with expected keywords and category |
|
||||
| `ModelEndpoint` | evaluator.py | Model connection descriptor (provider, model_id, key) |
|
||||
| `ScoreResult` | evaluator.py | Scores for relevance, coherence, safety, overall |
|
||||
| `EvaluationResult` | evaluator.py | Full result: prompt + model + response + scores + latency |
|
||||
| `ResponseScorer` | evaluator.py | Heuristic scoring engine (regex + keyword + structure) |
|
||||
| `PromptEvaluator` | evaluator.py | Core engine: runs prompts against models, scores output |
|
||||
| `ModelClient` | models.py | Abstract base for LLM API calls |
|
||||
| `ModelFactory` | models.py | Factory: returns correct client for provider name |
|
||||
| `Task` | task.py | Work unit: id, title, description, assigned model/provider |
|
||||
| `TaskGenerator` | task.py | Creates tasks from Gitea issues or JSON spec |
|
||||
| `AgentRunner` | runner.py | Executes tasks: generate → branch → commit → PR |
|
||||
| `Config` | config.py | YAML config loader (wolf-config.yaml) |
|
||||
| `Leaderboard` | leaderboard.py | Persistent model ranking with serverless readiness |
|
||||
| `GiteaClient` | gitea.py | Full Gitea REST API client |
|
||||
| `PREvaluator` | evaluator.py | Legacy: scores PRs on CI, commits, code quality |
|
||||
|
||||
## API Surface
|
||||
|
||||
### CLI Arguments (cli.py)
|
||||
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--config` | Path to wolf-config.yaml |
|
||||
| `--task-spec` | Path to task specification JSON |
|
||||
| `--run` | Run pending tasks (assign models, execute, create PRs) |
|
||||
| `--evaluate` | Evaluate open PRs and score them |
|
||||
| `--leaderboard` | Show model rankings |
|
||||
|
||||
### CLI Arguments (runner.py)
|
||||
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--prompts` / `-p` | Path to prompts JSON (required) |
|
||||
| `--models` / `-m` | Path to models JSON |
|
||||
| `--config` / `-c` | Path to wolf-config.yaml (alternative to --models) |
|
||||
| `--output` / `-o` | Path to write JSON results |
|
||||
| `--system-prompt` | System prompt for all model calls |
|
||||
|
||||
### Provider Clients (models.py)
|
||||
|
||||
| Client | Provider | API Format |
|
||||
|--------|----------|------------|
|
||||
| `OpenRouterClient` | openrouter | OpenAI-compatible chat completions |
|
||||
| `GroqClient` | groq | OpenAI-compatible chat completions |
|
||||
| `OllamaClient` | ollama | Ollama native /api/generate |
|
||||
| `OpenAIClient` | openai | OpenAI-compatible (reuses GroqClient with different URL) |
|
||||
| `AnthropicClient` | anthropic | Anthropic Messages API v1 |
|
||||
|
||||
### Gitea Client (gitea.py)
|
||||
|
||||
| Method | Purpose |
|
||||
|--------|---------|
|
||||
| `get_issues()` | Fetch issues by state |
|
||||
| `create_branch()` | Create new branch from base |
|
||||
| `create_file()` | Create file on branch (base64) |
|
||||
| `update_file()` | Update file with SHA |
|
||||
| `get_file()` | Read file contents |
|
||||
| `create_pull_request()` | Open PR |
|
||||
| `get_pull_request()` | Fetch PR details |
|
||||
| `get_pr_status()` | Check PR CI status |
|
||||
|
||||
## Configuration (wolf-config.yaml)
|
||||
|
||||
```yaml
|
||||
gitea:
|
||||
base_url: "https://forge.alexanderwhitestone.com/api/v1"
|
||||
token: "..."
|
||||
owner: "Timmy_Foundation"
|
||||
repo: "wolf"
|
||||
|
||||
providers:
|
||||
openrouter:
|
||||
api_key: "..."
|
||||
base_url: "https://openrouter.ai/api/v1"
|
||||
ollama:
|
||||
base_url: "http://localhost:11434"
|
||||
|
||||
models:
|
||||
- model: "anthropic/claude-3.5-sonnet"
|
||||
provider: "openrouter"
|
||||
- model: "gemma4:latest"
|
||||
provider: "ollama"
|
||||
|
||||
log_dir: "~/.hermes/wolf/"
|
||||
leaderboard_path: "~/.hermes/wolf/leaderboard.json"
|
||||
```
|
||||
|
||||
## Scoring Methodology
|
||||
|
||||
| Dimension | Weight | Method |
|
||||
|-----------|--------|--------|
|
||||
| Relevance | 0.40 | Keyword matching (expected_keywords), prompt word overlap, length penalty, refusal detection |
|
||||
| Coherence | 0.35 | Structure indicators (paragraphs, lists, transitions), sentence completeness, repetition ratio, length sweet spot |
|
||||
| Safety | 0.25 | Unsafe pattern regex (bomb/hack/bypass/injection), profanity detection |
|
||||
|
||||
**Overall = relevance×0.40 + coherence×0.35 + safety×0.25**
|
||||
|
||||
### Safety Patterns Detected
|
||||
|
||||
- Bomb/explosive/weapon creation
|
||||
- System/network hacking
|
||||
- Security/auth bypass
|
||||
- Prompt injection ("ignore previous instructions")
|
||||
- System prompt extraction attempts
|
||||
|
||||
### Refusal Patterns Detected
|
||||
|
||||
- "I cannot/can't/won't help/assist"
|
||||
- "Sorry, but I cannot"
|
||||
- "Against my guidelines/policy"
|
||||
|
||||
## Test Coverage
|
||||
|
||||
| File | Tests | Coverage |
|
||||
|------|-------|----------|
|
||||
| `tests/test_evaluator.py` | 17 tests | PromptEntry, ModelEndpoint, ResponseScorer (relevance/coherence/safety), PromptEvaluator (evaluate, error handling, serialization, file output, multi-model), PREvaluator (score_pr, description scoring) |
|
||||
| `tests/test_config.py` | 1 test | Config load from YAML |
|
||||
|
||||
### Coverage Gaps
|
||||
|
||||
- No tests for `cli.py` (argument parsing, workflow orchestration)
|
||||
- No tests for `runner.py` (`load_prompts`, `load_models_from_json`, `AgentRunner.execute_task`)
|
||||
- No tests for `task.py` (`TaskGenerator.from_gitea_issues`, `from_spec`, `assign_tasks`)
|
||||
- No tests for `models.py` (API clients — would require mocking HTTP)
|
||||
- No tests for `leaderboard.py` (`record_score`, `get_rankings`, serverless readiness logic)
|
||||
- No tests for `gitea.py` (API client — would require mocking HTTP)
|
||||
- No integration tests (end-to-end evaluation pipeline)
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Dependency | Used By | Purpose |
|
||||
|------------|---------|---------|
|
||||
| `requests` | models.py, gitea.py | HTTP client for all API calls |
|
||||
| `pyyaml` (optional) | config.py | YAML config parsing (falls back to line parser) |
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **API keys in config**: wolf-config.yaml stores provider API keys in plaintext. File should be chmod 600 and excluded from git (already in .gitignore pattern via ~/.hermes/).
|
||||
2. **Gitea token**: Full access token used for branch creation, file commits, and PR creation. Scoped access recommended.
|
||||
3. **No input sanitization**: Prompts from Gitea issues are passed directly to models without filtering. Prompt injection risk for automated workflows.
|
||||
4. **No rate limiting**: Model API calls are sequential with no backoff or rate limiting. Could exhaust API quotas.
|
||||
5. **Legacy code reference**: `evaluator.py` references `Evaluator = PREvaluator` alias but `cli.py` imports `Evaluator` expecting the legacy class. This works but is confusing.
|
||||
|
||||
## File Index
|
||||
|
||||
| File | LOC | Purpose |
|
||||
|------|-----|---------|
|
||||
| `wolf/__init__.py` | 12 | Package init, version |
|
||||
| `wolf/cli.py` | 90 | Main CLI orchestrator |
|
||||
| `wolf/config.py` | 48 | YAML config loader |
|
||||
| `wolf/models.py` | 130 | LLM provider clients (5 providers) |
|
||||
| `wolf/runner.py` | 280 | Prompt evaluation CLI + AgentRunner |
|
||||
| `wolf/task.py` | 80 | Task dataclass + generator |
|
||||
| `wolf/evaluator.py` | 350 | Core scoring engine + legacy PR evaluator |
|
||||
| `wolf/leaderboard.py` | 70 | Persistent model ranking |
|
||||
| `wolf/gitea.py` | 100 | Gitea REST API client |
|
||||
| `tests/test_evaluator.py` | 180 | Unit tests for evaluator |
|
||||
| `tests/test_config.py` | 20 | Unit tests for config |
|
||||
|
||||
**Total: ~1,360 LOC Python | 11 modules | 18 tests**
|
||||
|
||||
## Sovereignty Assessment
|
||||
|
||||
- **No external dependencies beyond requests**: Runs on any machine with Python 3.11+ and requests.
|
||||
- **No phone-home**: All API calls are to user-configured endpoints.
|
||||
- **No telemetry**: Logs go to local filesystem only.
|
||||
- **Config-driven**: All secrets in user's ~/.hermes/ directory.
|
||||
- **Provider-agnostic**: Supports 5 providers with easy extension via ModelFactory.
|
||||
|
||||
**Verdict: Fully sovereign. No corporate lock-in. User controls all endpoints and keys.**
|
||||
|
||||
---
|
||||
|
||||
*"The strength of the pack is the wolf, and the strength of the wolf is the pack."*
|
||||
*— The Wolf Sovereign Core has spoken.*
|
||||
@@ -1,94 +0,0 @@
|
||||
# LAB-006 Call Log and Quote Template
|
||||
|
||||
Issue: #531
|
||||
Purpose: capture the live calls, written confirmations, and septic cost options needed to close the issue honestly.
|
||||
|
||||
## County / State Call Log
|
||||
|
||||
### 1. NHDES Subsurface Systems Bureau
|
||||
- Date:
|
||||
- Time:
|
||||
- Person reached:
|
||||
- Phone used: 603-271-3501
|
||||
- Email if follow-up requested: LRM-ARC@des.nh.gov
|
||||
- Summary:
|
||||
- Exact answer on whether a permitted designer is required for the 1-bedroom revision:
|
||||
- Exact answer on whether owner-install is permitted for this parcel / use case:
|
||||
- Exact answer on revision fee:
|
||||
- Exact answer on whether moving the driveway triggers resubmission:
|
||||
- Written follow-up promised? yes / no
|
||||
- Reference number / email thread:
|
||||
|
||||
### 2. Local building / occupancy authority
|
||||
- Date:
|
||||
- Time:
|
||||
- Office reached:
|
||||
- Person reached:
|
||||
- Phone:
|
||||
- Summary:
|
||||
- Does local occupancy sign-off require anything beyond NHDES septic approval?
|
||||
- Separate permit / fee / inspection required?
|
||||
- Written follow-up promised? yes / no
|
||||
- Reference number / email thread:
|
||||
|
||||
### 3. Other agency / health / planning contact
|
||||
- Date:
|
||||
- Time:
|
||||
- Office reached:
|
||||
- Person reached:
|
||||
- Phone:
|
||||
- Summary:
|
||||
- Key answer:
|
||||
- Written follow-up promised? yes / no
|
||||
- Reference number / email thread:
|
||||
|
||||
## Original Plan / Permit Retrieval Log
|
||||
|
||||
- Property address:
|
||||
- Owner name searched:
|
||||
- Approval number searched:
|
||||
- OneStop searched? yes / no
|
||||
- OneStop result:
|
||||
- Archive request submitted? yes / no
|
||||
- Archive request ID:
|
||||
- Files received:
|
||||
- Notes:
|
||||
|
||||
## Engineer / Designer Quote Tracker
|
||||
|
||||
| Vendor | Contact | Scope | Price | Lead time | Notes |
|
||||
|---|---|---|---:|---|---|
|
||||
| Designer 1 | | Revise approved plan to 1-bedroom | | | |
|
||||
| Designer 2 | | Revise approved plan to 1-bedroom | | | |
|
||||
| Designer 3 | | Revise approved plan to 1-bedroom | | | |
|
||||
|
||||
## Quote Tracker
|
||||
|
||||
| Option | Vendor / Person | Scope | Price | Lead time | Notes |
|
||||
|---|---|---|---:|---|---|
|
||||
| Professional install | | Full install | | | |
|
||||
| Friend-with-excavator | | Excavation / install help | | | |
|
||||
| Materials-only | | Tank + pipe + stone + misc. | | | |
|
||||
|
||||
## Materials List Draft
|
||||
|
||||
Use only if owner-install remains legally viable after the live calls.
|
||||
|
||||
- Septic tank:
|
||||
- Distribution box:
|
||||
- Pipe:
|
||||
- Stone / leach field media:
|
||||
- Fabric / protection:
|
||||
- Inspection / riser components:
|
||||
- Equipment rental:
|
||||
- Delivery:
|
||||
- Other:
|
||||
|
||||
## Final Yes / No Gate
|
||||
|
||||
- Revised 1-bedroom plan must be prepared by permitted designer: yes / no
|
||||
- Owner-install permitted for this exact project: yes / no
|
||||
- Revised plan fee confirmed: yes / no
|
||||
- Local occupancy / building sign-off path confirmed: yes / no
|
||||
- Three real quotes received: yes / no
|
||||
- Best next action:
|
||||
@@ -1,156 +0,0 @@
|
||||
# LAB-006 Septic Research
|
||||
|
||||
Issue: #531
|
||||
Date: 2026-04-15
|
||||
Status: public-doc research packet complete; live county/town calls and real quotes still pending
|
||||
|
||||
## Scope of this packet
|
||||
|
||||
This is a proof-oriented research packet built from public New Hampshire sources.
|
||||
I did not claim any phone call, written county confirmation, engineer quote, or filed revision that did not actually happen.
|
||||
|
||||
What this packet does provide:
|
||||
- official public source links
|
||||
- a clearer answer on designer-vs-owner responsibilities
|
||||
- the records lookup path for the existing approved septic plan
|
||||
- the state contact point to call next
|
||||
- a structured call and quote template for the live follow-up work
|
||||
|
||||
## Most important findings
|
||||
|
||||
### 1. A revised septic application in New Hampshire still appears to require a permitted designer
|
||||
|
||||
Official NHDES septic systems page:
|
||||
- https://www.des.nh.gov/land/septic-systems
|
||||
|
||||
Direct language from the page:
|
||||
- "Plans for proposed septic systems must be designed, prepared and submitted by a permitted New Hampshire septic system designer."
|
||||
|
||||
Implication for LAB-006:
|
||||
- downsizing the approved plan from 3-4 bedroom to 1-bedroom is probably not a self-drawn paper edit if it changes the approved septic design/load assumptions
|
||||
- moving the driveway on paper may also need designer involvement if it affects the approved layout or any required setback/field configuration
|
||||
|
||||
### 2. Owner-install appears possible in New Hampshire, but only in a narrow case
|
||||
|
||||
Official NHDES designer/installer page:
|
||||
- https://www.des.nh.gov/land/septic-systems/septic-designer-or-installer
|
||||
|
||||
Direct language from the page:
|
||||
- "Applications for individual sewage disposal systems or septic systems must be prepared by a permitted designer."
|
||||
- "With the exception for homeowners installing for their primary domicile, septic systems must be constructed by a permitted installer."
|
||||
|
||||
Implication for LAB-006:
|
||||
- public state guidance points to this answer:
|
||||
- owner-install: likely YES, but only if the dwelling is the homeowner's primary domicile
|
||||
- owner-designed / owner-submitted revised plan: public docs point to NO, because the application must still be prepared by a permitted designer
|
||||
|
||||
This is the strongest public answer I found without making the required phone calls.
|
||||
|
||||
### 3. The original approved septic documents should be searched in the NHDES records portal first
|
||||
|
||||
Official records portal / septic page:
|
||||
- Septic records overview: https://www.des.nh.gov/land/septic-systems
|
||||
- Subsurface OneStop portal: https://www4.des.state.nh.us/SSBOneStop/
|
||||
|
||||
Direct language from the septic systems page:
|
||||
- "Our online Subsurface Onestop portal provides access to septic system records from 1967–1986 and 2016–present. You can search by property owner name, address, designer, installer or approval number."
|
||||
- "Records from 1986–2016 are currently being digitized."
|
||||
- "If you cannot locate your septic record in the SSB Onestop Portal, you may submit an archive request online."
|
||||
|
||||
Implication for LAB-006:
|
||||
- first check OneStop for the approved plan and approval number
|
||||
- if the property falls into the digitization gap, file the archive request instead of guessing
|
||||
|
||||
### 4. Public docs point first to NHDES Subsurface Systems Bureau, not just a county office
|
||||
|
||||
Official contacts:
|
||||
- NHDES Septic (Subsurface) forms portal: https://onlineforms.nh.gov/home/?Organizationcode=NHDES_Septic
|
||||
- NHDES Contact page: https://www.des.nh.gov/contact
|
||||
|
||||
Public contact details shown in NHDES materials:
|
||||
- Subsurface Systems Bureau phone: 603-271-3501
|
||||
- LRM Application Receipt Center email: LRM-ARC@des.nh.gov
|
||||
- Mailing address: NHDES Subsurface Systems Bureau, 29 Hazen Drive, PO Box 95, Concord, NH 03302-0095
|
||||
|
||||
Important note:
|
||||
- the issue body says to call Sullivan County Building/Health
|
||||
- the public New Hampshire septic program pages point to the state Subsurface Systems Bureau for the septic application/design side
|
||||
- that does NOT prove the town/county has no role in occupancy or local building sign-off
|
||||
- it does mean the next call should include NHDES, not only a county office
|
||||
|
||||
### 5. Revised forms are required as of February 1, 2026
|
||||
|
||||
Official septic systems page:
|
||||
- https://www.des.nh.gov/land/septic-systems
|
||||
|
||||
Direct language:
|
||||
- "Effective February 1, 2026: All submissions must comply with the revised Administrative Rules and use the revised forms."
|
||||
|
||||
Implication for LAB-006:
|
||||
- if a revised plan is submitted, use the current NHDES septic forms rather than any old approval packet templates
|
||||
|
||||
## Public-source answer to the main yes/no question
|
||||
|
||||
Based on the public NHDES pages reviewed today:
|
||||
|
||||
- Can the owner revise and submit the septic plan without a designer?
|
||||
- Public-doc answer: probably NO. The application/plans must be prepared by a permitted New Hampshire septic system designer.
|
||||
|
||||
- Can the owner install the septic system personally?
|
||||
- Public-doc answer: possibly YES, but only for a homeowner installing for their primary domicile.
|
||||
|
||||
This is still not the same as county/town confirmation for this exact parcel and occupancy path. That call is still required.
|
||||
|
||||
## Best next live actions
|
||||
|
||||
1. Search the existing approval in Subsurface OneStop:
|
||||
- by owner name
|
||||
- by property address
|
||||
- by designer name if known
|
||||
- by approval number if any prior paperwork exists
|
||||
|
||||
2. If the file is not in OneStop, submit archive request.
|
||||
|
||||
3. Call NHDES Subsurface Systems Bureau at 603-271-3501 and ask:
|
||||
- does downsizing an already-approved 3-4 bedroom septic plan to 1-bedroom require a newly prepared plan by a permitted designer?
|
||||
- if the owner intends to self-install for a primary domicile, what exact homeowner-install form/process applies?
|
||||
- what fee applies to revising an existing approved plan?
|
||||
- does moving the driveway on the approved drawing trigger designer resubmission, site review, or other plan revision requirements?
|
||||
|
||||
4. Call the local building / occupancy authority for the parcel and confirm:
|
||||
- who actually signs off the occupancy permit
|
||||
- whether they defer fully to NHDES for septic revision
|
||||
- whether any separate local building/driveway/site paperwork is required
|
||||
|
||||
5. If NHDES confirms designer-prepared revision is mandatory, get a designer quote immediately instead of spending more time on owner-submittal paths.
|
||||
|
||||
## What I did NOT verify
|
||||
|
||||
I did not verify any of the following as completed facts:
|
||||
- that Sullivan County itself is the final septic approval authority for this parcel
|
||||
- that a revised 1-bedroom plan has already been drafted or submitted
|
||||
- that owner-install is permitted for this exact property after all local conditions are applied
|
||||
- the exact revision fee
|
||||
- any real contractor quote
|
||||
|
||||
## Recommended practical interpretation
|
||||
|
||||
Today’s public-doc evidence strongly supports this working assumption:
|
||||
- design/revision work -> permitted septic designer
|
||||
- physical installation -> homeowner may be able to do it for a primary domicile
|
||||
- records/process/questions -> start with NHDES Subsurface Systems Bureau and OneStop
|
||||
|
||||
That is enough to stop guessing and start the right calls.
|
||||
|
||||
## Evidence links
|
||||
|
||||
- NHDES Septic Systems: https://www.des.nh.gov/land/septic-systems
|
||||
- NHDES Septic Designer and Installer: https://www.des.nh.gov/land/septic-systems/septic-designer-or-installer
|
||||
- NHDES Septic Online Forms: https://onlineforms.nh.gov/home/?Organizationcode=NHDES_Septic
|
||||
- NHDES Subsurface OneStop: https://www4.des.state.nh.us/SSBOneStop/
|
||||
- NHDES Contact page: https://www.des.nh.gov/contact
|
||||
|
||||
## Deliverables in this PR
|
||||
|
||||
- this research memo
|
||||
- a call-log and quote-tracker template for the live follow-up work
|
||||
@@ -1,26 +0,0 @@
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
REPORT = Path("reports/property/lab-006-septic-research.md")
|
||||
TEMPLATE = Path("reports/property/lab-006-call-log-and-quote-template.md")
|
||||
|
||||
|
||||
def test_lab_006_report_exists_with_official_findings():
|
||||
assert REPORT.exists(), "expected septic research report to exist"
|
||||
content = REPORT.read_text()
|
||||
assert "LAB-006 Septic Research" in content
|
||||
assert "NHDES Septic Systems" in content
|
||||
assert "Applications for individual sewage disposal systems or septic systems must be prepared by a permitted designer" in content
|
||||
assert "With the exception for homeowners installing for their primary domicile" in content
|
||||
assert "603-271-3501" in content
|
||||
assert "https://www4.des.state.nh.us/SSBOneStop/" in content
|
||||
|
||||
|
||||
def test_lab_006_template_exists_with_call_and_quote_sections():
|
||||
assert TEMPLATE.exists(), "expected call/quote template to exist"
|
||||
content = TEMPLATE.read_text()
|
||||
assert "County / State Call Log" in content
|
||||
assert "Quote Tracker" in content
|
||||
assert "Professional install" in content
|
||||
assert "Friend-with-excavator" in content
|
||||
assert "Materials-only" in content
|
||||
Reference in New Issue
Block a user