Commit Graph
2832 Commits
Author SHA1 Message Date
ryan4yin | 二花 e2548cd2aa docs(agents): close rule gaps found by evals and record the method (#428)
* docs(agents): state the boundaries the rules only implied
* docs(agents): grow the scenario tables and record the method
* docs(agents): record the evaluation rounds and their size cost
* docs(agents): require disclosure of AI-assisted contributions
* docs(agents): correct safety boundaries and eval records

Assisted-by: DeepSeek Harness (qwen3.8-flash-next iq3, gpt-6-luna & gpt-6.1-sol)
2026-10-10 15:59:57 +08:00
ryan4yin | 二花 9d69832ff7 refactor(agents): pin global skills and trim always-loaded context (#427)
* feat(agents): pin global skills as flake inputs
* refactor(agents): trim always-loaded agent context
2026-10-10 12:16:56 +08:00
ryan4yin | 二花 0d7c4d7cc1 feat(agents): extract global Git delivery skill #426 2026-10-10 11:18:39 +08:00
Ryan Yin 3b63028a05 fix: repair skill frontmatter and cap commit message length 2026-10-10 09:02:08 +08:00
ryan4yin | 二花 b52e242bb1 Merge pull request #425 from ryan4yin/docs/agents-rule-gaps
fix: close rule gaps behind repeated corrections and sync stale docs and recipes
2026-10-10 08:50:13 +08:00
Ryan Yin d64f9c71f1 fix(typos): keep wluma's als key and fix a flagged typo
The pre-commit hook runs typos with write = true, so the next edit to wluma.nix would silently rename wluma's ambient-light-sensor keys to also.
2026-10-10 08:42:38 +08:00
Ryan Yin 5a4a1d0c20 fix(darwin): run the rollback as root
darwin-rebuild rejects switch, activate, rollback and check unless it runs as
root, so the recipe could only ever print an error.
2026-10-10 08:42:38 +08:00
Ryan Yin 8843df1508 docs: correct stale claims found while reviewing the skills
No host defines a *-nixos-tests output; the pod firewall drops 5900-5903
from pod sources; the mihomo core keeps geodata and cache in its
StateDirectory; WA-020 was used twice and the cited WA-028 had no row.
2026-10-10 08:42:38 +08:00
Ryan Yin 60b80e64c8 fix(microvm): restart the guest unit on the physical host to deploy
microvm.nix's sshSwitch step runs nix-store --load-db against the guest's
read-only virtiofs /nix/store and dies there, so the recipe installs the
runner on the physical host and restarts microvm@<guest> instead.
2026-10-10 08:42:38 +08:00
Ryan Yin a2cfa5549c fix(skills): correct stale guidance and widen task triggers 2026-10-10 08:42:38 +08:00
Ryan Yin 2d07dc8da5 docs(agents): close rule gaps behind repeated corrections
Clause-level extensions only, no new sections. Publishing gains modals in both directions: the old sentence read as forbidding pushes to the user's own private repositories while leaving the disclosure direction a preference. The diagnosis scenario moves to Smoke because a cross-cutting rule has no area for the Extended trigger to select, and the guide separates cheap checks from behavioral runs so a modal-only edit does not cost a scenario suite.
2026-10-10 08:42:38 +08:00
Ryan Yin 3b2c328fd2 docs(idols-ai): mark the mixed-memory settings as daily-use verified 2026-10-10 07:19:45 +08:00
Ryan Yin bee8d5449f fix(ssh): prevent GitHub IPv6 regression
Restore the IPv4 pin removed by 1e6702db (feat(mihomo): answer AAAA and keep the tailnet off the TUN). Fake IPv6 SSH connections can authenticate and then hang.
2026-10-10 00:19:35 +08:00
Ryan Yin c3f72689d3 feat(darwin): start terminals fullscreen 2026-10-10 00:10:38 +08:00
Ryan Yin 7b1b8f6382 docs(agents): require per-push confirmation for default branches 2026-10-09 23:40:56 +08:00
Ryan Yin 2d2f2ca7c6 docs(agents): make concision and pre-publish scan rules enforceable 2026-10-09 23:31:48 +08:00
ryan4yin | 二花 e11375fbb8 feat(mihomo): sync the policy to Clash Verge on macOS (#424) 2026-10-09 23:27:59 +08:00
Ryan Yin dbe0f73ed5 feat(agents): link the global rules into dsh too
dsh reads ~/.dsh/AGENTS.md, plus ~/.agents/AGENTS.md from 0.2.1-alpha.2;
identical content renders once.
2026-10-09 22:53:46 +08:00
ryan4yin | 二花 0e12440148 refactor(secrets): move nushell-secrets.nu out of agenix (#423) 2026-10-09 22:40:50 +08:00
ryan4yin | 二花 92740ec968 fix(mihomo): answer AAAA on a public fake-ip pool, pin guests to a cluster ULA (#420)
* fix(microvm): pin guest IPv6 identity to a cluster ULA

The ISP retires delegated prefixes, so a guest that registers its WAN prefix
loses it and Cilium never refreshes the node address. Derive the identity from
the IPv4 octets inside fd05:5::/64 and trust that ULA in the guest firewall.

* feat(mihomo): answer AAAA and keep the tailnet off the TUN

fake-ip needs one pool per family, and the family a client picks does not pick the
egress family. Exclude the cluster ULA and the Tailscale ranges from the TUN; the ssh
pin and the WA-028 record cover the fake-AAAA stall.

* feat(mihomo): generate the config from the repo, not a copy in the live dir

`just mihomo-gen` runs generate.nu from the module and validates with the core
the service runs. ~/.config/mihomo keeps only sources.yaml and config.yaml.

* fix(mihomo): keep the fake IPv6 pool out of fc00::/7

The v6 fake pool is a lookup key, not the egress path, so it can be a public range: the
shipped ULA default reads as "local" to browsers and prompts for local-network access on
every site. The gvisor stack override goes with it -- mips is upstream's default, and
nftables rules out the kernel stack here.

* feat(mihomo): sniff on the gateway, not on the desktop

LAN clients using DoH dial the IPs they resolved, and a node may not reach an IP a
foreign resolver handed out. The gateway recovers the name from the handshake; on the
desktop the fake-ip table already names every flow. Its binary is a static release
build, not a package: update it by hand and validate the live config with the new core.

* fix(mihomo): name the Singapore nodes instead of matching 新

The single-char keyword also matched 新西兰, so the Singapore group held a New
Zealand node and url-test flipped the exit country mid-session.
2026-10-09 18:38:20 +08:00
Ryan Yin c102e2489d fix(mihomo): name the Singapore nodes instead of matching 新
The single-char keyword also matched 新西兰, so the Singapore group held a New
Zealand node and url-test flipped the exit country mid-session.
2026-10-09 18:34:48 +08:00
Ryan Yin 5a6cdf63ac feat(mihomo): sniff on the gateway, not on the desktop
LAN clients using DoH dial the IPs they resolved, and a node may not reach an IP a
foreign resolver handed out. The gateway recovers the name from the handshake; on the
desktop the fake-ip table already names every flow. Its binary is a static release
build, not a package: update it by hand and validate the live config with the new core.
2026-10-09 18:34:48 +08:00
Ryan Yin 7a4f62383f fix(mihomo): keep the fake IPv6 pool out of fc00::/7
The v6 fake pool is a lookup key, not the egress path, so it can be a public range: the
shipped ULA default reads as "local" to browsers and prompts for local-network access on
every site. The gvisor stack override goes with it -- mips is upstream's default, and
nftables rules out the kernel stack here.
2026-10-09 18:34:04 +08:00
Ryan Yin d9714337f3 feat(mihomo): generate the config from the repo, not a copy in the live dir
`just mihomo-gen` runs generate.nu from the module and validates with the core
the service runs. ~/.config/mihomo keeps only sources.yaml and config.yaml.
2026-10-09 18:34:04 +08:00
Ryan Yin 1e6702db2c feat(mihomo): answer AAAA and keep the tailnet off the TUN
fake-ip needs one pool per family, and the family a client picks does not pick the
egress family. Exclude the cluster ULA and the Tailscale ranges from the TUN; the ssh
pin and the WA-028 record cover the fake-AAAA stall.
2026-10-09 18:34:04 +08:00
Ryan Yin 9cf0a92a30 fix(microvm): pin guest IPv6 identity to a cluster ULA
The ISP retires delegated prefixes, so a guest that registers its WAN prefix
loses it and Cilium never refreshes the node address. Derive the identity from
the IPv4 octets inside fd05:5::/64 and trust that ULA in the guest firewall.
2026-10-09 18:30:13 +08:00
Ryan Yin 4c165ad7da docs(agents): prefer E2E verification of real workflows 2026-10-09 15:58:36 +08:00
ryan4yin | 二花 63b7183381 feat(mihomo): keep unproxiable ranges out of TUN, fix the startup DNS race (#419)
* feat(mihomo): keep ranges that can never be proxied out of TUN

The list lives in policy.yaml as tun_exclude_address; sources.yaml may override
it. 198.18.0.0/15 stays in TUN: that is the fake-ip range itself.

* feat(mihomo): match Valve's content servers by ASN

The 20 hand-copied prefixes had drifted from what AS32590 announces. The rule
type needs GeoLite2-ASN.mmdb, so geox-url.asn points at the same mirror.

* feat(mihomo): render the gateway config from the same sources

The hand-kept copy had drifted: a manual sync carried the desktop's secret onto
the gateway and dropped external-ui-url. --redact yields a shareable template.

* fix(mihomo): open the link DNS takeover only once the core serves it

The core opens :1053 after parsing rules, and rule parsing is where missing
geodata gets fetched. Flipping at fork time made that fetch SERVFAIL, the config
fatal, and the unit unstartable.

* fix(justfile): keep local endpoints out of the agent proxy

With only HTTP_PROXY set, a request to this host's own llama-swap endpoint went
to mihomo. Node matches exact hosts only, so the literals carry it; the CIDRs
serve curl and Go.

* feat(justfile): seed mihomo geodata into the service state dir

So a cold start never needs the download that the DNS takeover made unstartable.
2026-10-09 12:31:59 +08:00
Ryan Yin fe302fa950 docs(idols-ai): record overnight mixed-memory voltage tests 2026-10-09 07:44:51 +08:00
Ryan Yin 841214c325 docs(idols-ai): summarize mixed-memory voltage tests
Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2026-10-09 00:30:15 +08:00
Ryan Yin dd46fb3fb2 docs(agents): clarify credential boundaries and rule maintenance 2026-10-08 23:45:47 +08:00
Ryan Yin 19b9aff7bf fix(tuios): handle stopped daemon during shell startup 2026-10-08 23:39:38 +08:00
ryan4yin | 二花 4a27852fd1 fix(tuios): create sessions with cwd before attaching (#418) 2026-10-08 20:50:28 +08:00
ryan4yin | 二花 48ac4f76bf fix(tuios): keep sessions across reboots and split them by purpose (#416) 2026-10-08 20:29:52 +08:00
Ryan Yin 9ba2cf5229 chore: pin tuios to v0.9.0; require pinned third-party inputs 2026-10-08 15:47:20 +08:00
ryan4yin | 二花 60bd70bd0c refactor(agents): configure dsh from its profile patch (#415) 2026-10-08 15:29:31 +08:00
ryan4yin | 二花 9e2633f496 feat(gaming): generic umu game installer, skill, and desktop entries (#411) 2026-10-08 14:59:11 +08:00
ryan4yin | 二花 efd279c7d1 fix(noctalia): avoid mihomo network speed double count (#414) 2026-10-08 13:31:57 +08:00
ryan4yin | 二花 dc211bbca3 fix(mihomo): restore the Steam community and store PROXY rules (#412)
The comment trim dropped them. Without a domain rule above the Valve IP ranges,
steamcommunity.com and steampowered.com match those ranges and go DIRECT.
2026-10-08 09:50:41 +08:00
ryan4yin | 二花 257e9b13d2 docs: add the NixOS modernization options and decision record (#409) 2026-10-08 09:49:29 +08:00
Ryan Yin 0b29b15697 feat: add nh 2026-10-08 09:44:19 +08:00
ryan4yin | 二花 ded8d91507 feat(mihomo): keep Steam downloads off the proxy so Steam keeps a CN CDN (#408)
Steam picks download caches from the IP it sees on the CM login. Pin the CM hosts
and content CDN DIRECT, keep the community and store proxied, and add Valve's
AS32590 ranges because Steam dials cached CM IPs without a lookup. Sources in
README.md.
2026-10-08 09:41:51 +08:00
ryan4yin | 二花 c89c5e9698 fix(mihomo): say what a dropped catch-all actually costs (#410) 2026-10-08 09:40:17 +08:00
ryan4yin | 二花 835b7f6df1 feat(shoukei): pin home Wi-Fi to a static IPv4 & adjust networking.nix (#407) v0.18.0 2026-10-07 21:27:34 +08:00
Ryan Yin e9d706aa96 fix(apparmor): correct the sudo profile comment's conclusion
The abort needs havePrivateMountNs == false AND /nix/store still ro:
remountReadOnlyWritable() returns early while the store is writable. Nix
<= 2.34 left it rw until reboot; 2.35 remounts in a private namespace, so
only a freshly booted host hits it. The repro command also uses an open-only
exec 7<..., since cat fails on the read even when the open succeeds.

While here, trim the comments and drop the disabled default_deny/nix
policies plus the explicit killUnconfinedConfinables=false (nixpkgs
default). 82 -> 34 lines.
2026-10-07 20:22:43 +08:00
Ryan Yin 124bcd8490 docs: drop the stale "just test exit code" caveat
`just test` has enforced the suite result since #350: the recipe raises unless
`evalTests` is `true`, so a zero exit already means pass. Update the places that
still described the old raw-`nix eval` behaviour: AGENTS.md, README.md,
SECURITY.md, outputs/README.md, and the nix-config-debug / nix-config-new-host /
nix-config-update skills.

The exit-0 caveat is kept only where the raw `nix eval .#evalTests` command is
documented, because that command genuinely exits 0 even on `false`.
2026-10-07 19:54:32 +08:00
ryan4yin | 二花 6f136b50e4 fix(shoukei): mitigate brcmfmac wifi auth failures, document duplicate-profile bug (#406)
BCM4378/brcmfmac intermittently fails Wi-Fi association (ASSOC-REJECT /
authentication timeout) on this laptop. NetworkManager misreads the failure
as a bad key and re-prompts; whichever client reconnects (Noctalia, nmtui,
nmcli) then saves the answer as a duplicate "<SSID> 1" profile. The problem
predates the Noctalia v5 shell and is driven by the driver, not the shell.

- disable Wi-Fi powersave on shoukei, a common source of brcmfmac auth timeouts
- WORKAROUNDS.md WA-024: the powersave mitigation and its removal condition
- WORKAROUNDS.md WA-025: the pending upstream brcmfmac port_authorized fix
- document how to recover a wedged supplicant without rebooting, and that
  deleting an active NM profile is what turned a reconnect into a dead link

Refs: https://patchew.org/linux/20260915-brcmfmac-4way-handshake-offload-authenticated-event-v2-1-fbb9cc7ac177@jannau.net/
2026-10-07 19:52:57 +08:00
Ryan Yin 0d800c4d9c fix(apparmor): attach disconnected paths in the sudo profile
Nix 2.35's root nix-env -- used by nixos-rebuild to set the system profile --
calls saveMountNamespace(), which opens /proc/self/ns/mnt before remounting
the read-only /nix/store writable. Those magic links have no connected path,
so AppArmor cannot match them against any rule and denies the open with
EACCES even in complain mode. The private mount namespace is then never
created and nixos-rebuild aborts with:

  cannot remount "/nix/store" writable: not in a private mount namespace

Adding flags=(attach_disconnected) lets AppArmor re-root those paths on / so
the existing `file /**` rule matches. This also fixes any other sudo'd tool
that needs namespaces (unshare, nsenter, bwrap, ...).

Rolling this out to a host that already has the old profile loaded needs one
deploy with --no-reexec, so the current system's Nix performs nix-env --set
instead of the new system's; after that generation is active, plain
`just niri` works and the Nix version is never rolled back.
2026-10-07 19:39:42 +08:00
Ryan Yin 94312fc2e5 ci: bound and retry the Gitee mirror push
Gitee's SSH gateway intermittently accepts the connection and key, then never
answers the initial git-receive-pack and drops the session ~100s later with
"the remote end hung up upon initial contact". The same failure mode shows up
sporadically since 2026-10-02 and spiked on 2026-10-07 (9 of 14 runs failed).

Bound each push attempt with `timeout`, retry up to six times with exponential
backoff, and add ssh connect/keepalive timeouts. Serialize runs (a push to main
and a tag on the same commit used to race for Gitee's per-repo push lock), cap
the job at 30 minutes, and allow manual workflow_dispatch reruns.
2026-10-07 19:02:46 +08:00
ryan4yin | 二花 8f065f24bc feat(nix): use Nix 2.35 via nixVersions.latest (#405)
Nix 2.35 brings lazy flake source copying, mimalloc (5-12% faster
evaluation), lower nix-daemon memory use, HTTP/3 support, and jittered
transfer retries with Retry-After.
2026-10-07 18:32:09 +08:00