Compare commits

...
Author SHA1 Message Date
root fbc8146560 fix: simplify LIVE_GW_PID (read locally, parse locally, liveness check)
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 7s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 14s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 3s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 3s
Defect A fix (round 3): The double-quoted ssh command had nested
substitution that made it a parse error. Now reads gateway.pid via
SSH, parses it locally with python3, then tests liveness with a
separate short SSH. This removes the whole class of nested-quoting
bugs.

Defect C fix: Step 2 simplified - each grep runs independently, a
missing per-user dir prints probe-failed, never silent empty.

Proof: bash -n passes; block as written runs for koby (LIVE_GW_PID
resolved, step2=VIOLATION 4 hits, step3=PASS), koonimo (LIVE_GW_PID
resolved, step2=VIOLATION 1 hit, step3=PASS), mumuni (LIVE_GW_PID
resolved, step2=probe-failed per-user dir missing, step3=PASS).

Correlation: corr=ad99803cf327c19a
2026-10-03 12:29:40 +00:00
root 6220797b63 fix: four defects - A (step3 var scope), B (user path), C (guard), D (map)
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 7s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 11s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 2s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 3s
Defect A: Step B now uses double-quoted ssh so ${HERMES_HOME} (local) is
interpolated on the runner, not the remote shell where it's unset.
Defect B: SYSTEMD_USER_DIR comes from the static per-agent map, not
/home/${USER} (which is /home/root for root agents).
Defect C: Each scan location gets its own probe-failed line; a missing
per-user dir now prints probe-failed instead of silent empty.
Defect D: USER detection eliminated - the static map is the single source
of truth for both HERMES_HOME and SYSTEMD_USER_DIR.

Correlation: corr=910414eb28b22117
2026-10-03 12:08:29 +00:00
root ab3ad1f03d fix: simplify LIVE_GW_PID resolution (avoid nested quote hell)
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 7s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 8s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 9s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 8s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 1s
Use simpler python3 -c approach that reads gateway.pid directly, then
checks /proc/$PID existence. Avoids the nested f-string quoting issue.

Correlation: corr=b9f997fb9f6e7914
2026-10-03 11:57:07 +00:00
root 824bb75dc4 fix: split HERMES_HOME (static) from LIVE_GW_PID (step 3 only)
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 3s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 4s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 14s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 1s
- HERMES_HOME: always resolvable per agent from explicit map
  (mumuni=/home/hermes/.hermes, koby/koonimo=/root/.hermes, tanko=/home/jerome/.hermes)
  Used by steps 1/1b so they run even when gateway is down
- LIVE_GW_PID: resolved from gateway.pid + liveness check, used ONLY by step 3
- HARD GUARD: empty HERMES_HOME prints probe-failed, never expands to /
- Tanko: config at /home/jerome/.hermes/config.yaml now scanned by construction

Correlation: corr=b9f997fb9f6e7914
2026-10-03 11:55:10 +00:00
root 0812374977 fix: step 2 per-agent systemd paths + resolver no longer guesses
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 10s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 14s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 3s
Defect 1: Step 2 was scanning hardcoded /root/.config/systemd/user/ which
doesn't exist on tanko (units at /etc/systemd/system/hermes.service.d and
/home/jerome/.config/systemd/user/) or mumuni (units at /etc/systemd/system/
hermes-gateway.service.d). Now scans system-level /etc/systemd/system/*hermes*
AND the per-user systemd dir for the user that runs the units. A missing/empty
scan location renders as probe-failed, never as compliant.

Defect 2: The HERMES_PATH resolver ended with 'else echo /home/jerome/.hermes',
which is tanko's path, handed to EVERY agent that has no live gateway.pid. Now
checks tanko's path too (with liveness check), and if no live gateway.pid can
be resolved, leaves HERMES_PATH empty (probe-failed, not a guessed path).

Correlation: corr=136b6c5778391087
2026-10-03 11:34:40 +00:00
root 7feacfbc3b fix: hermes-key-enforcement per-agent path resolution
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 8s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 14s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 2s
The contract had hardcoded /home/jerome/.hermes and /root/.hermes paths, which
was wrong for agents using different users. This fix:

1. Adds a HERMES_PATH variable that resolves per-agent paths:
   - Checks if /home/hermes/.hermes/gateway.pid exists AND process is alive
   - Checks if /root/.hermes/gateway.pid exists AND process is alive
   - Falls back to /home/jerome/.hermes if neither works

2. Updates steps 1, 1b, and 3 to use ${HERMES_PATH} instead of hardcoded paths

3. Fixes Step 3's nested quoting issue by extracting the PID in a separate
   command, then using it in the cat /proc/$PID/environ command

Per-agent verification (2026-10-03):
- Tanko (.122): HERMES_PATH=/home/jerome/.hermes, Step 1 found 2 violations, Step 3 probe-failed
- Mumuni (.14): HERMES_PATH=/home/hermes/.hermes, all steps pass, Step 3 shows LITELLM_API_KEY
- Koby (.129): HERMES_PATH=/root/.hermes, all steps pass, Step 3 shows LITELLM_API_KEY
- Koonimo (.114): HERMES_PATH=/root/.hermes, all steps pass, Step 3 shows LITELLM_API_KEY

Correlation: corr=bcb049b3a0b6433f
2026-10-03 11:19:30 +00:00
abiba-bot 595e67bda6 Merge pull request 'fix(search): expect the seven engines that actually contribute, not the five that don't' (#149) from fix/search-stack-multiprovider-20261003 into master
PR Pipeline — Authorize → Validate → Review → Merge / auth (push) Successful in 18s
PR Pipeline — Authorize → Validate → Review → Merge / validate (push) Successful in 7s
PR Pipeline — Authorize → Validate → Review → Merge / lint (push) Successful in 18s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (push) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / gate (push) Successful in 2s
2026-10-03 10:13:04 +00:00
root 9c6346e3ff Merge master into fix/search-stack-multiprovider-20261003 (pick up the #150 lint allowlist fix so the PR's lint job can pass)
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 9s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 9s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 21s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 9s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 2s
2026-10-03 10:08:47 +00:00
abiba-bot 1f02b00aaa Merge pull request 'fix: prose-lint allowlist for synthetic credential example' (#150) from fix/prose-lint-allowlist-20261003 into master
PR Pipeline — Authorize → Validate → Review → Merge / auth (push) Failing after 10m47s
PR Pipeline — Authorize → Validate → Review → Merge / validate (push) Skipped
PR Pipeline — Authorize → Validate → Review → Merge / lint (push) Skipped
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (push) Skipped
PR Pipeline — Authorize → Validate → Review → Merge / gate (push) Skipped
2026-10-03 10:07:31 +00:00
root 3fe5cc3af1 fix: prose-lint allowlist for synthetic credential example
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 13s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 23s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 11s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 1s
The synthetic example 'sk-synthetic-litellm-' in hermes-key-enforcement.prose.md:217
was flagged by the secret-assign rule as a credential-shaped assignment. The
existing allowlist entry only covered openai-key, so secret-assign still failed.

Fix: Change the rule from openai-key to * (matches any rule) and update the
reason to explain why (2026-10-03: secret-assign also matches the credential-shaped
assignment).

This restores prose-lint on master, which was RED and blocking every open PR's
lint job (including PR #149's lint job 2160).

Chose option (b) (allowlist) over option (a) (restructure) because:
- The existing entry already documented the synthetic example
- Changing the rule to * is the minimal, honest fix
- Restructuring the command would risk weakening the enforcement check

Correlation: corr=7c202734ec6c452a
2026-10-03 09:36:15 +00:00
root 6608d3162f fix(search): expect the seven engines that actually contribute, not the five that don't
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 14s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Failing after 10s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 10s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Skipped
The visibility contract's expected-engine set was still the 2026-09-25 list
(bing, brave, google cse, yandex, duckduckgo). Three of those five are blocked
upstream today, so the check had gone quiet on the engines that DO carry the
stack and noisy on ones that cannot.

The live stack now runs ten engines enabled: seven that returned real results
from this network (bing, yandex, yep, mwmbl, naver, seznam, yahoo) plus the
three best-effort canaries kept for recovery visibility (brave, duckduckgo,
google cse). The expected set is updated to match, so a silent zero is reported
for every engine the stack actually runs.

Live proof after the engine expansion (CT 100, 2026-10-03):
  'proxmox backup server'   -> 7 contributing engines
  'python asyncio tutorial' -> 6 contributing engines
  VERDICT: PASS
Before the change both queries contributed from bing alone, one engine above
the two-engine floor.

Verified broken cases still fail and name the cause: a single-engine floor
exits 1 naming the sole contributor, a broken extraction exits 1, and an
unreachable SearXNG exits 2.

Contract text and version updated to the 2026-10-03 state.
2026-10-03 09:28:09 +00:00
abiba-bot 8dac151063 Merge pull request 'fix: hermes-key-enforcement probe timeout - bounded scan, honest failure kinds' (#148) from fix/hermes-key-enforcement-probe-timeout-20261002 into master
PR Pipeline — Authorize → Validate → Review → Merge / auth (push) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / validate (push) Successful in 8s
PR Pipeline — Authorize → Validate → Review → Merge / lint (push) Failing after 16s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (push) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / gate (push) Skipped
2026-10-02 12:19:25 +00:00
4 changed files with 114 additions and 33 deletions
+82 -19
View File
@@ -193,34 +193,97 @@ Run on any Hermes host to detect violations.
**Bounded scan (2026-10-02):** Do NOT recurse the entire `/root/.hermes/` tree. Use `--exclude-dir=state-snapshots` to skip dated snapshot directories. Rationale: a superseded config will always carry a superseded key and will report forever with zero signal content (the koby state-snapshot line has repeated on consecutive days). If you deliberately want to include snapshots, say so in the contract and the report.
```bash
# 1. Check config.yaml for hardcoded harness keys (bounded scan — excludes state-snapshots)
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"grep -rn 'api_key: sk-' /root/.hermes/ --exclude-dir=state-snapshots --include='config.yaml' | grep -v 'deepseek\|openai\|anthropic\|DEEPSEEK'" \
2>/dev/null
# Per-agent path resolution (2026-10-03): mumuni /home/hermes/.hermes, koonimo/koby /root/.hermes, tanko /home/jerome/.hermes (down)
# HERMES_HOME is ALWAYS resolvable per agent from an explicit map, independent of whether anything is running
# SYSTEMD_USER_DIR is the per-user systemd dir for the agent (from the same map)
# LIVE_GW_PID is needed ONLY by step 3; steps 1/1b use HERMES_HOME and run even when the gateway is down
# HARD GUARD: an empty/unresolved HERMES_HOME must never expand into `/` or an empty glob
# Interpret exit status:
# 0 = match found (violation)
# 1 = no match (pass)
# 124 = timeout (probe-failed, not unreachable)
# 255 = ssh connect failed (unreachable)
# other = probe-failed (record the actual code)
# Step A: Resolve HERMES_HOME and SYSTEMD_USER_DIR from the static per-agent map (no SSH needed)
# mumuni: /home/hermes/.hermes + /home/hermes/.config/systemd/user
# koby/koonimo: /root/.hermes + /root/.config/systemd/user
# tanko: /home/jerome/.hermes + /home/jerome/.config/systemd/user
HERMES_HOME="$(case "<agent>" in
mumuni) echo "/home/hermes/.hermes" ;;
koby|koonimo) echo "/root/.hermes" ;;
tanko) echo "/home/jerome/.hermes" ;;
*) echo "" ;;
esac)"
SYSTEMD_USER_DIR="$(case "<agent>" in
mumuni) echo "/home/hermes/.config/systemd/user" ;;
koby|koonimo) echo "/root/.config/systemd/user" ;;
tanko) echo "/home/jerome/.config/systemd/user" ;;
*) echo "" ;;
esac)"
# Step B: Resolve LIVE_GW_PID (only for step 3) - check if gateway.pid exists and process is alive
# NOTE: Simpler approach - read gateway.pid locally, parse locally, then test liveness with a separate SSH
LIVE_GW_PID="$(ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"if [ -n '${HERMES_HOME}' ] && [ -f '${HERMES_HOME}/gateway.pid' ]; then \
cat '${HERMES_HOME}/gateway.pid'; \
fi" 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin).get("pid",""))' 2>/dev/null)"
# Test liveness with a second short SSH
if [ -n "$LIVE_GW_PID" ]; then
if ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"[ -d /proc/${LIVE_GW_PID} ]" 2>/dev/null; then
LIVE_GW_PID="" # Gateway is down
fi
fi
# 1. Check config.yaml for hardcoded harness keys (bounded scan — excludes state-snapshots)
# Uses HERMES_HOME (not LIVE_GW_PID) so it runs even when the gateway is down
if [ -n "${HERMES_HOME}" ]; then
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"grep -rn 'api_key: sk-' ${HERMES_HOME}/ --exclude-dir=state-snapshots --include='config.yaml' | grep -v 'deepseek\|openai\|anthropic\|DEEPSEEK'" \
2>/dev/null
# Interpret exit status:
# 0 = match found (violation)
# 1 = no match (pass)
# 124 = timeout (probe-failed, not unreachable)
# 255 = ssh connect failed (unreachable)
# other = probe-failed (record the actual code)
else
echo "probe-failed: could not resolve the Hermes home for <agent>"
fi
# 1b. Check for double-path bug: base_url ending with /responses
# (Hermes appends /v1/responses when api_mode=responses, so base_url must end at /v1)
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"grep -rn 'litellm/v1/responses' /root/.hermes/config.yaml" 2>/dev/null
# ANY output here = WRONG. Must be 'litellm/v1' without /responses suffix.
# Uses HERMES_HOME (not LIVE_GW_PID) so it runs even when the gateway is down
if [ -n "${HERMES_HOME}" ]; then
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"grep -rn 'litellm/v1/responses' ${HERMES_HOME}/config.yaml" 2>/dev/null
# ANY output here = WRONG. Must be 'litellm/v1' without /responses suffix.
else
echo "probe-failed: could not resolve the Hermes home for <agent>"
fi
# 2. Check systemd drop-ins for master key leaks (2026-07-05: Tanko had this)
# NOTE: Both greps are inside ONE quoted remote command, separated by ; (not two separate ssh arguments)
# NOTE: Scan system-level /etc/systemd/system/*hermes* AND the per-user systemd dir (from the static map)
# Per-agent systemd user dirs (from the map, measured 2026-10-03):
# koby/koonimo: /root/.config/systemd/user
# tanko: /home/jerome/.config/systemd/user
# mumuni: /home/hermes/.config/systemd/user
# All agents: /etc/systemd/system/ (system-level units)
# A missing/empty scan location must render as probe-failed, never as compliant
# NOTE: Double-quoted ssh command so ${SYSTEMD_USER_DIR} (local var) is interpolated on the runner
# Each grep runs independently; a missing dir prints probe-failed, never silent empty
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"grep -rn 'LITELLM_API_KEY' /root/.config/systemd/user/ 2>/dev/null; grep -rn 'LITELLM_API_KEY=sk-synthetic-litellm-' /root/.config/systemd/ 2>/dev/null" ; true
"grep -rn 'LITELLM_API_KEY' /etc/systemd/system/*hermes* 2>/dev/null; \
if [ -d '${SYSTEMD_USER_DIR}' ]; then \
grep -rn 'LITELLM_API_KEY' '${SYSTEMD_USER_DIR}/' 2>/dev/null; \
else \
echo 'probe-failed: per-user systemd dir ${SYSTEMD_USER_DIR} not found'; \
fi" ; true
# 3. Verify running process env matches dedicated key
# NOTE: Single-quoted remote command so $(...) expands on the REMOTE host, not the runner
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
'cat /proc/$(cat /home/jerome/.hermes/gateway.pid | python3 -c "import sys,json; print(json.load(sys.stdin)['pid'])")/environ | tr "\0" "\n" | grep LITELLM_API_KEY' \
&& echo "step3: PASS" || echo "step3: probe-failed (exit $?; see stderr above)"
# NOTE: Uses LIVE_GW_PID (not HERMES_HOME) - only runs when gateway is up
if [ -n "$LIVE_GW_PID" ]; then
timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@<ip> \
"cat /proc/${LIVE_GW_PID}/environ | tr '\0' '\n' | grep LITELLM_API_KEY" \
&& echo "step3: PASS" || echo "step3: probe-failed (exit $?; see stderr above)"
else
echo "step3: probe-failed (no live gateway.pid for this agent)"
fi
```
If any output from step 2 — **critical violation** (master key leaked). Fix immediately.
+14 -2
View File
@@ -61,11 +61,23 @@ EXTRACT_URL = os.environ.get(
# engines (images, videos, translate, currency, arxiv, npm, ...) are excluded on
# purpose -- contributing nothing to a general query is correct for them.
DEFAULT_EXPECTED_ENGINES = [
# Multi-engine expansion 2026-10-03. The stack had fallen to Bing-only:
# brave and google cse are suspended upstream, duckduckgo CAPTCHAs both
# egresses and yandex flaps. The seven below all returned real results
# from this network and are the engines a general query must draw on.
"bing",
"brave",
"google cse",
"yandex",
"yep",
"mwmbl",
"naver",
"seznam",
"yahoo",
# Best-effort canaries: intentionally left enabled so a recovery shows up
# as a contribution and a failure stays visible in unresponsive_engines.
# All three are blocked upstream today.
"brave",
"duckduckgo",
"google cse",
]
EXPECTED_ENGINES = [
e.strip()
+1 -1
View File
@@ -35,7 +35,7 @@ bearer-token agent-zero-fix-summary.md «vault: agents/production OPENROUTER_API
# example is always an explicit exception, never a pattern-level exemption.
* hermes-key-enforcement.prose.md sk-synthetic-external-example Rule 15 illustration of a hardcoded external key that is tolerated; fabricated, never a live key.
* hermes-key-enforcement.prose.md sk-synthetic-example-12345 Rule 15 illustration of a forbidden hardcoded key; fabricated, never a live key.
openai-key hermes-key-enforcement.prose.md sk-synthetic-litellm- Fabricated key name inside a `grep 'LITELLM_API_KEY=...'` example; not a live key.
* hermes-key-enforcement.prose.md sk-synthetic-litellm- Fabricated key name inside a `grep 'LITELLM_API_KEY=...'` example; not a live key. (2026-10-03: changed rule from openai-key to * because secret-assign also matches the credential-shaped assignment)
secret-assign hermes-key-enforcement.prose.md sk-NEW_KEY Placeholder standing for the rotated key in an `infisical secrets set` command; not a literal key.
openrouter-key agent-zero-openrouter-key.prose.md sk-or-v1-synthetic Synthetic key prefix in the contract's example response; the real key is read from the vault.
openai-key litellm-api-keys.prose.md sk-synthetic-tanko-example Fabricated key name in migration history prose; not a live key.
Can't render this file because it contains an unexpected character in line 23 and column 25.
+17 -11
View File
@@ -17,11 +17,16 @@ description: >
* reports every silent-zero engine explicitly (enabled, not in
unresponsive_engines, contributed no results).
Multi-engine state (2026-09-25): bing, google cse, brave and yandex
contribute on every query. duckduckgo is NOT working: the house egress IP
and the VPS fallback egress are both flagged by DuckDuckGo and it reports
CAPTCHA. It is left enabled as best-effort coverage so that a recovery shows
up as a contribution.
Multi-engine state (2026-10-03): the stack had fallen to Bing-only -- brave
and google cse are suspended upstream, duckduckgo CAPTCHAs both egresses and
yandex flaps. Every no-credential free general engine this build ships was
enabled and probed. Seven now contribute real results on a general query:
bing, yandex, yep, mwmbl, naver, seznam and yahoo. brave, duckduckgo and
google cse are left enabled as best-effort canaries so a recovery shows up as
a contribution and their failure stays visible in unresponsive_engines.
mojeek, startpage and dogpile are `inactive: true` in the build (proof-of-work
CAPTCHA), marginalia needs an API key, and qwant and fireball were tested and
dropped (CAPTCHA and access-denied).
google cse is a third party's public search-engine id hardcoded in the
SearXNG build. Quota and availability are outside our control.
@@ -29,7 +34,7 @@ description: >
SCHEDULED: /etc/cron.d/contract-runner on CT 100 (abiba), hourly at :15,
via scripts/contract-run.sh search-stack-visibility. Logs land in
/var/log/contract-runs/. A failure also raises a firstmate inbox note.
version: 1.1.0
version: 1.2.0
---
## Purpose
@@ -54,11 +59,12 @@ firstmate inbox note through `bin/fm-inbox.sh`.
```
$ bash scripts/contract-run.sh search-stack-visibility
Expected engines, enabled (5): ['bing', 'brave', 'duckduckgo', 'google cse', 'yandex']
queries: 'proxmox backup server' -> contributing: bing, brave, google cse, yandex
unresponsive: duckduckgo=CAPTCHA
'python asyncio tutorial' -> contributing: bing, brave, google cse, yandex
EXTRACTION: 71016 chars of markdown returned
Expected engines, enabled (10): ['bing', 'brave', 'duckduckgo', 'google cse',
'mwmbl', 'naver', 'seznam', 'yahoo', 'yandex', 'yep']
queries: 'proxmox backup server' -> contributing: bing, mwmbl, naver, seznam, yahoo, yandex, yep
unresponsive: brave, duckduckgo, google cse
'python asyncio tutorial' -> contributing: bing, mwmbl, naver, seznam, yandex, yep
EXTRACTION: 71532 chars of markdown returned
VERDICT: PASS -- multiple engines contributing, extraction healthy
```