diff --git a/.pi-lens/cache/jscpd.json b/.pi-lens/cache/jscpd.json
new file mode 100644
index 0000000..5bc59bb
--- /dev/null
+++ b/.pi-lens/cache/jscpd.json
@@ -0,0 +1,2568 @@
+{
+ "success": true,
+ "clones": [
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_38/patches/gradle-flutter-tools-wrapper.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/gradle-flutter-tools-wrapper.patch",
+ "startB": 1,
+ "lines": 219,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_38/patches/fix-macos-build-macos-assemble-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-macos-build-macos-assemble-sh.patch",
+ "startB": 1,
+ "lines": 59,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_38/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startB": 1,
+ "lines": 68,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_38/patches/disable-auto-update.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/disable-auto-update.patch",
+ "startB": 1,
+ "lines": 29,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_35/patches/gradle-flutter-tools-wrapper.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/gradle-flutter-tools-wrapper.patch",
+ "startB": 1,
+ "lines": 219,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_35/patches/fix-macos-build-macos-assemble-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-macos-build-macos-assemble-sh.patch",
+ "startB": 1,
+ "lines": 59,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_35/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startB": 1,
+ "lines": 68,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_35/patches/disable-auto-update.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/disable-auto-update.patch",
+ "startB": 1,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_32/patches/gradle-flutter-tools-wrapper.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/gradle-flutter-tools-wrapper.patch",
+ "startB": 1,
+ "lines": 59,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_32/patches/gradle-flutter-tools-wrapper.patch",
+ "startA": 155,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/gradle-flutter-tools-wrapper.patch",
+ "startB": 155,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_32/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startB": 1,
+ "lines": 38,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_32/patches/disable-auto-update.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/disable-auto-update.patch",
+ "startB": 1,
+ "lines": 30,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_29/patches/gradle-flutter-tools-wrapper.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/gradle-flutter-tools-wrapper.patch",
+ "startB": 1,
+ "lines": 219,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_29/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/fix-ios-build-xcode-backend-sh.patch",
+ "startB": 1,
+ "lines": 68,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_29/patches/disable-auto-update.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/versions/3_41/patches/disable-auto-update.patch",
+ "startB": 1,
+ "lines": 30,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/calamares-nixos-extensions/src/branding/nixos/nix-snowflake.svg",
+ "startA": 149,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/calamares-nixos-extensions/src/branding/nixos/nix-snowflake.svg",
+ "startB": 139,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/calamares-nixos-extensions/src/branding/nixos/nix-snowflake.svg",
+ "startA": 169,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/calamares-nixos-extensions/src/branding/nixos/nix-snowflake.svg",
+ "startB": 159,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs",
+ "startA": 148,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs",
+ "startB": 134,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/hocon/src/src/main.rs",
+ "startA": 133,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs",
+ "startB": 177,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/hocon/src/src/main.rs",
+ "startA": 230,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs",
+ "startB": 252,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/dyld/patches/0005-Add-OpenSSL-based-CoreCrypto-digest-functions.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/network_cmds/patches/0007-Add-OpenSSL-based-CoreCrypto-digest-functions.patch",
+ "startB": 1,
+ "lines": 74,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/dyld/patches/0005-Add-OpenSSL-based-CoreCrypto-digest-functions.patch",
+ "startA": 88,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/network_cmds/patches/0007-Add-OpenSSL-based-CoreCrypto-digest-functions.patch",
+ "startB": 86,
+ "lines": 224,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/sys-no-explicit-intrinsics-dep.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/sys-no-explicit-intrinsics-dep.patch",
+ "startB": 4,
+ "lines": 38,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/stand-label.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/stand-label.patch",
+ "startB": 1,
+ "lines": 37,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/stand-label.patch",
+ "startA": 45,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/stand-label.patch",
+ "startB": 45,
+ "lines": 345,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/rc-user.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/rc-user.patch",
+ "startB": 1,
+ "lines": 17,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/mount-use-path.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/mount-use-path.patch",
+ "startB": 1,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/mk.patch",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/bsd-lib-mk-force-static.patch",
+ "startB": 2,
+ "lines": 48,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/localedef.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/localedef.patch",
+ "startB": 1,
+ "lines": 31,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/localedef.patch",
+ "startA": 48,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/15.0/localedef.patch",
+ "startB": 47,
+ "lines": 111,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/13.1/compat-install-dirs.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/compat-install-dirs.patch",
+ "startB": 1,
+ "lines": 40,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/13.1/compat-fix-typedefs-locations.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/bsd/freebsd/patches/14.2/compat-fix-typedefs-locations.patch",
+ "startB": 1,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tcl-modules/by-name/ti/tix/fix-clang16.patch",
+ "startA": 161,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tcl-modules/by-name/ti/tix/fix-clang16.patch",
+ "startB": 133,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.12/no-ldconfig.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.13/no-ldconfig.patch",
+ "startB": 1,
+ "lines": 51,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.11/no-ldconfig.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.13/no-ldconfig.patch",
+ "startB": 1,
+ "lines": 51,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/2.7/python-2.7-distutils-C++.patch",
+ "startA": 124,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.11/python-3.x-distutils-C++.patch",
+ "startB": 119,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/2.7/python-2.7-distutils-C++.patch",
+ "startA": 159,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.11/python-3.x-distutils-C++.patch",
+ "startB": 156,
+ "lines": 26,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/openjdk/11/patches/swing-use-gtk-jdk10.patch",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/openjdk/8/patches/swing-use-gtk-jdk8.patch",
+ "startB": 4,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/openjdk/11/patches/read-truststore-from-env-jdk10.patch",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/openjdk/8/patches/read-truststore-from-env-jdk8.patch",
+ "startB": 3,
+ "lines": 28,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/21/llvm/gnu-install-dirs.patch",
+ "startA": 79,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/22/llvm/gnu-install-dirs.patch",
+ "startB": 79,
+ "lines": 56,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/20/llvm/gnu-install-dirs.patch",
+ "startA": 41,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/21/llvm/gnu-install-dirs.patch",
+ "startB": 41,
+ "lines": 72,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/18/llvm/gnu-install-dirs.patch",
+ "startA": 38,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/21/llvm/gnu-install-dirs.patch",
+ "startB": 41,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/18/llvm/gnu-install-dirs.patch",
+ "startA": 100,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/20/llvm/gnu-install-dirs.patch",
+ "startB": 102,
+ "lines": 23,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/18/compiler-rt/armv6-scudo-libatomic.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/llvm/19/compiler-rt/armv6-scudo-libatomic.patch",
+ "startB": 1,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/dart/package-source-builders/flutter_discord_rpc/cargokit.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/dart/package-source-builders/rhttp/cargokit.patch",
+ "startB": 1,
+ "lines": 90,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/commonmark.py",
+ "startA": 61,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manpage.py",
+ "startB": 130,
+ "lines": 7,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/commonmark.py",
+ "startA": 95,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manpage.py",
+ "startB": 183,
+ "lines": 7,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/commonmark.py",
+ "startA": 121,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manpage.py",
+ "startB": 221,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/commonmark.py",
+ "startA": 182,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manpage.py",
+ "startB": 283,
+ "lines": 6,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/asciidoc.py",
+ "startA": 133,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/commonmark.py",
+ "startB": 104,
+ "lines": 6,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/asciidoc.py",
+ "startA": 202,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/html.py",
+ "startB": 171,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/split_paths_test.py",
+ "startA": 13,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/subcomponent_test.py",
+ "startB": 14,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/split_paths_test.py",
+ "startA": 138,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/subcomponent_test.py",
+ "startB": 149,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startA": 65,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/split_paths_test.py",
+ "startB": 29,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash",
+ "startA": 59,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash",
+ "startB": 32,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v2/hooks/composer-install-hook.sh",
+ "startA": 8,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v2/hooks/composer-vendor-hook.sh",
+ "startB": 8,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh",
+ "startA": 23,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh",
+ "startB": 19,
+ "lines": 35,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/editors/jetbrains/updater/jetbrains_nix_updater/update_src.py",
+ "startA": 60,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/editors/jetbrains/updater/jetbrains_nix_updater/update_src.py",
+ "startB": 37,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 59,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 29,
+ "lines": 23,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 81,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 51,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 95,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 65,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 141,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 91,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 325,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 143,
+ "lines": 7,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 354,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 160,
+ "lines": 39,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 458,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 214,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 513,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 241,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 578,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 275,
+ "lines": 16,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/limine/limine-install.py",
+ "startA": 615,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/refind/refind-install.py",
+ "startB": 312,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/grub/install-grub.pl",
+ "startA": 595,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/grub/install-grub.pl",
+ "startB": 544,
+ "lines": 6,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-wrapped-settings-constructor-patched/main.c",
+ "startB": 5,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 40,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 4,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 64,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 52,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 81,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 30,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 92,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 29,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startA": 104,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 91,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c",
+ "startA": 4,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 4,
+ "lines": 74,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c",
+ "startA": 77,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 77,
+ "lines": 16,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c",
+ "startA": 92,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched-with-exists-fn/main.c",
+ "startB": 29,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c",
+ "startA": 105,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c",
+ "startB": 92,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/linux/bootstrap-tools/glibc/unpack-bootstrap-tools.sh",
+ "startA": 56,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/linux/bootstrap-tools/musl/unpack-bootstrap-tools.sh",
+ "startB": 43,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/sql/postgresql/patches/empty-pg-config-view-15+.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/sql/postgresql/patches/empty-pg-config-view.patch",
+ "startB": 1,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startA": 14,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_9/oauth2-basic-secret-modify.patch",
+ "startB": 14,
+ "lines": 54,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startA": 91,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_9/oauth2-basic-secret-modify.patch",
+ "startB": 91,
+ "lines": 41,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startA": 134,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_9/oauth2-basic-secret-modify.patch",
+ "startB": 134,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/oauth2-basic-secret-modify.patch",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startB": 3,
+ "lines": 65,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/oauth2-basic-secret-modify.patch",
+ "startA": 89,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startB": 89,
+ "lines": 43,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/oauth2-basic-secret-modify.patch",
+ "startA": 134,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_9/oauth2-basic-secret-modify.patch",
+ "startB": 134,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_6/recover-account.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/recover-account.patch",
+ "startB": 1,
+ "lines": 48,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_6/recover-account.patch",
+ "startA": 51,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/recover-account.patch",
+ "startB": 51,
+ "lines": 71,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_6/oauth2-basic-secret-modify.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/oauth2-basic-secret-modify.patch",
+ "startB": 1,
+ "lines": 158,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_5/oauth2-basic-secret-modify.patch",
+ "startA": 11,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_8/oauth2-basic-secret-modify.patch",
+ "startB": 11,
+ "lines": 57,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_5/oauth2-basic-secret-modify.patch",
+ "startA": 79,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/kanidm/provision-patches/1_7/oauth2-basic-secret-modify.patch",
+ "startB": 79,
+ "lines": 52,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/sgx/psw/disable-downloads.patch",
+ "startA": 14,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/sgx/sdk/disable-downloads.patch",
+ "startB": 12,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/sgx/psw/cppmicroservices-no-mtime.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/sgx/sdk/cppmicroservices-no-mtime.patch",
+ "startB": 1,
+ "lines": 26,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/minimal-bootstrap/python/no-ldconfig.patch",
+ "startA": 69,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/python/cpython/3.13/no-ldconfig.patch",
+ "startB": 14,
+ "lines": 38,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/minimal-bootstrap/gnumake/0001-No-impure-bin-sh.patch",
+ "startA": 4,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/build-managers/gnumake/patches/0001-No-impure-bin-sh.patch",
+ "startB": 4,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startA": 50,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startB": 17,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startA": 59,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startB": 26,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startA": 92,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/darwin/apple-source-releases/libiconv/nixpkgs_test.c",
+ "startB": 26,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/windres-locate-gcc.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/2.38/windres-locate-gcc.patch",
+ "startB": 1,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/always-search-rpath.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/2.38/always-search-rpath.patch",
+ "startB": 1,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/misc/binutils/2.38/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch",
+ "startB": 1,
+ "lines": 136,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/electron/binary/update.py",
+ "startA": 121,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/electron/binary/update.py",
+ "startB": 97,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/electron/binary/update.py",
+ "startA": 136,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/tools/electron/binary/update.py",
+ "startB": 112,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/torch/bin/prefetch.sh",
+ "startA": 29,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/science/math/libtorch/prefetch.sh",
+ "startB": 15,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/fix-qt-builtin-paths.sh",
+ "startA": 40,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/fix-qt-builtin-paths.sh",
+ "startB": 16,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh",
+ "startA": 36,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh",
+ "startB": 36,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/wrap-qt-apps-hook.sh",
+ "startA": 77,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/wrap-qt-apps-hook.sh",
+ "startB": 76,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/qmake-hook.sh",
+ "startA": 22,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/qmake-hook.sh",
+ "startB": 15,
+ "lines": 29,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/fix-qt-module-paths.sh",
+ "startA": 10,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/fix-qt-module-paths.sh",
+ "startB": 8,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/fix-qt-builtin-paths.sh",
+ "startA": 12,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/fix-qt-builtin-paths.sh",
+ "startB": 9,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/fix-qt-builtin-paths.sh",
+ "startA": 42,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/fix-qt-builtin-paths.sh",
+ "startB": 19,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-5/hooks/fix-qmake-libtool.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/qt-6/hooks/fix-qmake-libtool.sh",
+ "startB": 1,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/update/update.py",
+ "startA": 65,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/update/update.py",
+ "startB": 40,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/update/update.py",
+ "startA": 138,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/flutter/update/update.py",
+ "startB": 110,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ya/yarn-berry/fetcher/berry-3-offline.patch",
+ "startA": 84,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ya/yarn-berry/fetcher/berry-4-offline.patch",
+ "startB": 80,
+ "lines": 29,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gt/gtk3/hooks/drop-icon-theme-cache.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gt/gtk4/hooks/drop-icon-theme-cache.sh",
+ "startB": 1,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gt/gtk2/hooks/drop-icon-theme-cache.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gt/gtk4/hooks/drop-icon-theme-cache.sh",
+ "startB": 1,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cn/cnijfilter_4_00/patches/cnijfilter-3.80-1-cups-1.6.patch",
+ "startA": 15,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cn/cnijfilter_4_00/patches/cnijfilter-3.80-6-cups-1.6.patch",
+ "startB": 40,
+ "lines": 40,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/node/prefetch-npm-deps/src/main.rs",
+ "startA": 617,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/node/prefetch-npm-deps/src/main.rs",
+ "startB": 544,
+ "lines": 27,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/dotnet/build-dotnet-module/hook/dotnet-hook.sh",
+ "startA": 366,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/dotnet/build-dotnet-module/hook/dotnet-hook.sh",
+ "startB": 112,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/dotnet/build-dotnet-module/hook/dotnet-hook.sh",
+ "startA": 393,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/dotnet/build-dotnet-module/hook/dotnet-hook.sh",
+ "startB": 112,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/science/logic/satallax/minisat-fenv.patch",
+ "startA": 26,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/science/logic/satallax/minisat-fenv.patch",
+ "startB": 5,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/lib/test-driver/src/test_driver/logger.py",
+ "startA": 269,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/lib/test-driver/src/test_driver/logger.py",
+ "startB": 216,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/lib/test-driver/src/test_driver/logger.py",
+ "startA": 309,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/lib/test-driver/src/test_driver/logger.py",
+ "startB": 200,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/diffutils/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 18,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 18,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/diffutils/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 30,
+ "lines": 111,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/diffutils/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 154,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 154,
+ "lines": 77,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/misc/findutils/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 32,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 31,
+ "lines": 65,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/misc/findutils/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 167,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 165,
+ "lines": 44,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/overlength-strings/overlength-strings.c",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/prefix/prefix.c",
+ "startB": 1,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/combination/combination.c",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/prefix/prefix.c",
+ "startB": 1,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/combination/combination.c",
+ "startA": 21,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/make-binary-wrapper/suffix/suffix.c",
+ "startB": 9,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/dict/wiktionary/wiktionary2dict.py",
+ "startA": 168,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/dict/wiktionary/wiktionary2dict.py",
+ "startB": 153,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/busybox/busybox-in-store.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/os-specific/linux/minimal-bootstrap/busybox/busybox-in-store.patch",
+ "startB": 1,
+ "lines": 23,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/kde/plasma/kwin-x11/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch",
+ "startB": 1,
+ "lines": 114,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/kde/frameworks/extra-cmake-modules/ecm-hook.sh",
+ "startA": 72,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/kde-frameworks/extra-cmake-modules/setup-hook.sh",
+ "startB": 70,
+ "lines": 36,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/web/nodejs/gyp-patches-set-fallback-value-for-CLT-darwin.patch",
+ "startA": 39,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/web/nodejs/gyp-patches-set-fallback-value-for-CLT-darwin.patch",
+ "startB": 9,
+ "lines": 26,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/triton/prefetch.sh",
+ "startA": 21,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/science/math/libtorch/prefetch.sh",
+ "startB": 15,
+ "lines": 24,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/torchvision/prefetch.sh",
+ "startA": 28,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/science/math/libtorch/prefetch.sh",
+ "startB": 15,
+ "lines": 24,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/torchaudio/prefetch.sh",
+ "startA": 32,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/science/math/libtorch/prefetch.sh",
+ "startB": 18,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/pygame-ce/fix-dependency-finding.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/pygame-original/fix-dependency-finding.patch",
+ "startB": 1,
+ "lines": 41,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/pgpy/Fix-compat-with-current-cryptography.patch",
+ "startA": 16,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/pgpy-dtc/Fix-compat-with-current-cryptography.patch",
+ "startB": 4,
+ "lines": 31,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/ocrmypdf/use-pillow-heif.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/ocrmypdf_16/use-pillow-heif.patch",
+ "startB": 1,
+ "lines": 26,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/ocrmypdf/paths.patch",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/ocrmypdf_16/paths.patch",
+ "startB": 39,
+ "lines": 30,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/jupytext/fix-yarn-lock-typescript-offline-cache.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/python-modules/jupytext/fix-yarn-lock-typescript.patch",
+ "startB": 5,
+ "lines": 54,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startA": 391,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startB": 349,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startA": 399,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startB": 312,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startA": 425,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startB": 325,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startA": 429,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/mobile/androidenv/update.rb",
+ "startB": 371,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startA": 169,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startB": 126,
+ "lines": 44,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startA": 308,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startB": 276,
+ "lines": 33,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startA": 340,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startB": 276,
+ "lines": 33,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startA": 472,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/tpm2-tss/no-dynamic-loader-path.patch",
+ "startB": 438,
+ "lines": 33,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/intel-oneapi/test.c",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/mk/mkl/test/test.c",
+ "startB": 5,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-4.8.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-5.3.patch",
+ "startB": 5,
+ "lines": 37,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-4.8.patch",
+ "startA": 67,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-5.3.patch",
+ "startB": 67,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-4.8.patch",
+ "startA": 133,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-5.3.patch",
+ "startB": 133,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-4.8.patch",
+ "startA": 192,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/db/clang-5.3.patch",
+ "startB": 226,
+ "lines": 24,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 5,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 20,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 20,
+ "lines": 107,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 161,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 161,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 192,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 192,
+ "lines": 369,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 598,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 598,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-187.patch",
+ "startA": 646,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/boost/Fix-cygwin-build-189.patch",
+ "startB": 633,
+ "lines": 49,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/julia-modules/python/minimal_registry.py",
+ "startA": 17,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/julia-modules/python/project.py",
+ "startB": 12,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/julia-modules/python/dedup_overrides.py",
+ "startA": 2,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/julia-modules/python/format_overrides.py",
+ "startB": 2,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/spidermonkey/allow-system-s-nspr-and-icu-on-bootstrapped-sysroot-128.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/interpreters/spidermonkey/allow-system-s-nspr-and-icu-on-bootstrapped-sysroot.patch",
+ "startB": 1,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/squeak/squeak-squeaksh-nixpkgs.patch",
+ "startA": 29,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/squeak/squeak-squeaksh-nixpkgs.patch",
+ "startB": 9,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/semeru-bin/generate-sources.py",
+ "startA": 76,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/temurin-bin/generate-sources.py",
+ "startB": 64,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/sbcl/dynamic-space-size-envvar-2.5.2-tests.patch",
+ "startA": 57,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/sbcl/dynamic-space-size-envvar-2.5.3-tests.patch",
+ "startB": 96,
+ "lines": 17,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/sbcl/dynamic-space-size-envvar-2.5.2-feature.patch",
+ "startA": 15,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/sbcl/dynamic-space-size-envvar-2.5.3-feature.patch",
+ "startB": 14,
+ "lines": 31,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.4-llvm-use-new-pass-manager.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.6-llvm-use-new-pass-manager.patch",
+ "startB": 1,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.4-llvm-use-new-pass-manager.patch",
+ "startA": 56,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.6-llvm-use-new-pass-manager.patch",
+ "startB": 56,
+ "lines": 31,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.4-docs-sphinx-9.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/ghc-9.6-or-later-docs-sphinx-9.patch",
+ "startB": 1,
+ "lines": 17,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.16-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 36,
+ "lines": 63,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.16-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 150,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 156,
+ "lines": 54,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 18,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.16-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 18,
+ "lines": 89,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 148,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 154,
+ "lines": 56,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 233,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 239,
+ "lines": 39,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 271,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 277,
+ "lines": 152,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch",
+ "startA": 496,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/ghc/Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch",
+ "startB": 502,
+ "lines": 101,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/dotnet/vmr-compiler-opt-v8.patch",
+ "startA": 25,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/dotnet/vmr-compiler-opt-v9.patch",
+ "startB": 211,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto17-gradle8.patch",
+ "startA": 110,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto21-gradle8.patch",
+ "startB": 128,
+ "lines": 40,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto11-gradle8.patch",
+ "startA": 127,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto21-gradle8.patch",
+ "startB": 116,
+ "lines": 52,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto11-gradle8.patch",
+ "startA": 197,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/corretto/corretto21-gradle8.patch",
+ "startB": 202,
+ "lines": 48,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/wi/windmill/run.go.config.proto.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/wi/windmill/run.rust.config.proto.patch",
+ "startB": 5,
+ "lines": 33,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/sw/sway-unwrapped/load-configuration-from-etc.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/sw/swayfx-unwrapped/load-configuration-from-etc.patch",
+ "startB": 1,
+ "lines": 48,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/su/super-slicer/0001-fix-assertion-using-hide-in-destroy.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/wx/wxGTK31/0001-fix-assertion-using-hide-in-destroy.patch",
+ "startB": 1,
+ "lines": 42,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/se/serious-sam-classic/tfe-force-using-system-path.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/se/serious-sam-classic/tse-force-using-system-path.patch",
+ "startB": 5,
+ "lines": 56,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ru/rustdesk-flutter/build-runner.sh",
+ "startA": 2,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh",
+ "startB": 17,
+ "lines": 41,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/rs/rss2email/html2text-2025.4.15-compat.patch",
+ "startA": 228,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/rs/rss2email/html2text-2025.4.15-compat.patch",
+ "startB": 112,
+ "lines": 23,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/re/renameutils/install-exec.patch",
+ "startA": 17,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/re/renameutils/install-exec.patch",
+ "startB": 5,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radicle-ci-broker/update.sh",
+ "startA": 9,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radicle-native-ci/update.sh",
+ "startB": 9,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radarr/update.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 1,
+ "lines": 46,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radarr/update.py",
+ "startA": 46,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 46,
+ "lines": 27,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radarr/update.py",
+ "startA": 77,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 76,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ra/radarr/update.py",
+ "startA": 91,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 90,
+ "lines": 92,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prowlarr/update.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 1,
+ "lines": 46,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prowlarr/update.py",
+ "startA": 46,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 46,
+ "lines": 27,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prowlarr/update.py",
+ "startA": 77,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 76,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prowlarr/update.py",
+ "startA": 91,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 90,
+ "lines": 92,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pl/plex-desktop/update.sh",
+ "startA": 29,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pl/plex-htpc/update.sh",
+ "startB": 29,
+ "lines": 16,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pl/plex-desktop/update.sh",
+ "startA": 45,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pl/plex-htpc/update.sh",
+ "startB": 45,
+ "lines": 26,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pl/platformsh/update.sh",
+ "startA": 12,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/up/upsun/update.sh",
+ "startB": 12,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pa/passage/set-correct-program-name-for-sleep.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/security/pass/set-correct-program-name-for-sleep.patch",
+ "startB": 1,
+ "lines": 49,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pa/pagefind/cargo-lock.patch",
+ "startA": 285,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pa/pagefind/web-cargo-lock.patch",
+ "startB": 3,
+ "lines": 83,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ov/oven-media-engine/support-ffmpeg-7.patch",
+ "startA": 352,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ov/oven-media-engine/support-ffmpeg-7.patch",
+ "startB": 168,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ov/oven-media-engine/support-ffmpeg-7.patch",
+ "startA": 376,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ov/oven-media-engine/support-ffmpeg-7.patch",
+ "startB": 168,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/op/openutau/update.sh",
+ "startA": 4,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonic-pi/update.sh",
+ "startB": 4,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/op/openutau/update.sh",
+ "startA": 18,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonic-pi/update.sh",
+ "startB": 18,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/od/odoo17/update.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/od/odoo18/update.sh",
+ "startB": 1,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/od/odoo/update.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/od/odoo18/update.sh",
+ "startB": 1,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/oc/ocis_5-bin/update.py",
+ "startA": 129,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ro/roon-server/update.py",
+ "startB": 58,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nim-unwrapped-1_0/extra-mangling.patch",
+ "startA": 23,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ni/nim-unwrapped-2_2/extra-mangling-2.patch",
+ "startB": 40,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/nd/ndi/update.py",
+ "startA": 25,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/nd/ndi-6/update.py",
+ "startB": 25,
+ "lines": 53,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ma/makeDBusConf/make-system-conf.xsl",
+ "startA": 9,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl",
+ "startB": 9,
+ "lines": 7,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ma/makeDBusConf/make-session-conf.xsl",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ma/makeDBusConf/make-system-conf.xsl",
+ "startB": 1,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ma/mailpit/update.sh",
+ "startA": 31,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prometheus/update.sh",
+ "startB": 35,
+ "lines": 7,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ma/mailpit/update.sh",
+ "startA": 53,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pr/prometheus/update.sh",
+ "startB": 57,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lightway/backport-darwin-address-calc-fix.patch",
+ "startA": 69,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lightway/backport-darwin-address-calc-fix.patch",
+ "startB": 19,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lightway/backport-darwin-address-calc-fix.patch",
+ "startA": 94,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lightway/backport-darwin-address-calc-fix.patch",
+ "startB": 44,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lidarr/update.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 1,
+ "lines": 46,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lidarr/update.py",
+ "startA": 46,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 46,
+ "lines": 27,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lidarr/update.py",
+ "startA": 76,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 76,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/lidarr/update.py",
+ "startA": 90,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonarr/update.py",
+ "startB": 90,
+ "lines": 92,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libtins/cmake-3.10.patch",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/xs/xss-lock/cmake-3.10.patch",
+ "startB": 3,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libredirect/libredirect.c",
+ "startA": 135,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libredirect/libredirect.c",
+ "startB": 114,
+ "lines": 16,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libproxy/hardcode-gsettings.patch",
+ "startA": 79,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libproxy/hardcode-gsettings.patch",
+ "startB": 9,
+ "lines": 62,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libfprint-2-tod1-broadcom-cv3plus/wrapper-lib.c",
+ "startB": 5,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libad9361/cmake-3.10.patch",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/xs/xss-lock/cmake-3.10.patch",
+ "startB": 3,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ko/kodelife/update.sh",
+ "startA": 9,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/to/touchosc/update.sh",
+ "startB": 9,
+ "lines": 46,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ke/keepass/extractWinRscIconsToStdFreeDesktopDir.sh",
+ "startA": 41,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ic/iconConvTools/bin/extractWinRscIconsToStdFreeDesktopDir.sh",
+ "startB": 50,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ju/junicode/test-vf.tex",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ju/junicode/test.tex",
+ "startB": 3,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ju/junicode/test-vf.tex",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ju/junicode/test.tex",
+ "startB": 30,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/hq/hqplayerd/add-option-for-installation-sysconfdir.patch",
+ "startA": 16,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ry/rygel/add-option-for-installation-sysconfdir.patch",
+ "startB": 16,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnutls/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 32,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 30,
+ "lines": 110,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnutls/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 156,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 30,
+ "lines": 110,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnutls/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startA": 280,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/tools/text/gnugrep/gnulib-float-h-tests-port-to-C23-PowerPC-GCC.patch",
+ "startB": 154,
+ "lines": 64,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnome-shell-extensions/fix_gtop.patch",
+ "startA": 5,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/desktops/gnome/extensions/extensionOverridesPatches/system-monitor_at_gnome-shell-extensions.gcampax.github.com.patch",
+ "startB": 5,
+ "lines": 21,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnome-settings-daemon/add-gnome-session-ctl-option.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gn/gnome-settings-daemon48/add-gnome-session-ctl-option.patch",
+ "startB": 1,
+ "lines": 58,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gi/gitbeaker-cli/update.sh",
+ "startA": 15,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/up/uppy-companion/update.sh",
+ "startB": 14,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gi/gildas/clang.patch",
+ "startA": 2,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/im/imager/clang.patch",
+ "startB": 2,
+ "lines": 23,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gc/gclient2nix/gclient2nix.py",
+ "startA": 56,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/networking/browsers/chromium/depot_tools.py",
+ "startB": 39,
+ "lines": 27,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/gc/gclient2nix/gclient2nix.py",
+ "startA": 110,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/networking/browsers/chromium/depot_tools.py",
+ "startB": 69,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/et/etcd_3_5/update.sh",
+ "startA": 9,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/et/etcd_3_6/update.sh",
+ "startB": 9,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/et/etcd_3_5/update.sh",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/et/etcd_3_6/update.sh",
+ "startB": 30,
+ "lines": 45,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cu/curl-impersonate/update.sh",
+ "startA": 21,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/so/sonic-pi/update.sh",
+ "startB": 17,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cu/curl-impersonate/update.sh",
+ "startA": 54,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/op/openutau/update.sh",
+ "startB": 32,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cu/cuneiform/gcc14-fix.patch",
+ "startA": 136,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/cu/cuneiform/gcc14-fix.patch",
+ "startB": 17,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/catppuccin-kde/color.sh",
+ "startA": 16,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ca/catppuccin-kde/color.sh",
+ "startB": 7,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/br/brioche/update-librusty.sh",
+ "startA": 12,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/wi/windmill/update-librusty.sh",
+ "startB": 12,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/br/brioche/update-librusty.sh",
+ "startA": 20,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/wi/windmill/update-librusty.sh",
+ "startB": 20,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_7/trim-last-argument-to-gcc-if-empty.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_8/patches/trim-last-argument-to-gcc-if-empty.patch",
+ "startB": 1,
+ "lines": 36,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_7/strict_action_env.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_8/patches/strict_action_env.patch",
+ "startB": 1,
+ "lines": 13,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_7/darwin_sleep.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ba/bazel_8/patches/darwin_sleep.patch",
+ "startB": 1,
+ "lines": 56,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/av/avy/minisat-fenv.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/science/logic/satallax/minisat-fenv.patch",
+ "startB": 1,
+ "lines": 57,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ar/ardour/default-plugin-search-paths.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ar/ardour_8/default-plugin-search-paths.patch",
+ "startB": 1,
+ "lines": 54,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/al/althttpd/update.sh",
+ "startA": 15,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/pi/pikchr/update.sh",
+ "startB": 15,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh",
+ "startA": 51,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libcosmicAppHook/libcosmic-app-hook.sh",
+ "startB": 58,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh",
+ "startA": 64,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/li/libcosmicAppHook/libcosmic-app-hook.sh",
+ "startB": 71,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/node/fetch-yarn-deps/yarn-config-hook.sh",
+ "startA": 10,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ya/yarn-berry/fetcher/yarn-berry-config-hook.sh",
+ "startB": 10,
+ "lines": 36,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/node/fetch-yarn-deps/fixup.js",
+ "startA": 60,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/node/fetch-yarn-deps/index.js",
+ "startB": 186,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-fresh.patch",
+ "startA": 56,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-still.patch",
+ "startB": 118,
+ "lines": 51,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-collabora.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-fresh.patch",
+ "startB": 1,
+ "lines": 28,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-collabora.patch",
+ "startA": 76,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-fresh.patch",
+ "startB": 41,
+ "lines": 66,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-collabora.patch",
+ "startA": 157,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/office/libreoffice/skip-broken-tests-fresh.patch",
+ "startB": 135,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/gis/qgis/set-pyqt-package-dirs-ltr.patch",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/applications/gis/qgis/set-pyqt-package-dirs.patch",
+ "startB": 1,
+ "lines": 49,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/installer/tools/nixos-generate-config.pl",
+ "startA": 408,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/nixos/modules/system/boot/loader/grub/install-grub.pl",
+ "startB": 140,
+ "lines": 8,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startA": 58,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startB": 16,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startA": 71,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startB": 47,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startA": 156,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startB": 116,
+ "lines": 10,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/auto-patchelf-hook-preserve-origin/lib-main.c",
+ "startA": 3,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/test/stdenv-inputs/lib-main.c",
+ "startB": 3,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/cygwin/rebase-i686.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/cygwin/rebase-x86_64.sh",
+ "startB": 1,
+ "lines": 11,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/cygwin/rebase-i686.sh",
+ "startA": 13,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/stdenv/cygwin/rebase-x86_64.sh",
+ "startB": 13,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/shells/bash/update-patch-set.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/libraries/readline/update-patch-set.sh",
+ "startB": 1,
+ "lines": 54,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/home-assistant/update.py",
+ "startA": 24,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/mu/music-assistant/update-providers.py",
+ "startB": 68,
+ "lines": 25,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/home-assistant/update.py",
+ "startA": 116,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/mu/music-assistant/update-providers.py",
+ "startB": 96,
+ "lines": 22,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/servers/home-assistant/update-component-packages.py",
+ "startA": 168,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ap/apache-airflow/update-providers.py",
+ "startB": 56,
+ "lines": 18,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startA": 485,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startB": 310,
+ "lines": 62,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startA": 660,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startB": 310,
+ "lines": 62,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startA": 835,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/perl-modules/net-snmp-add-sha-algorithms.patch",
+ "startB": 310,
+ "lines": 62,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/setup-hooks/role.bash",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/ap/apple-sdk/setup-hooks/role.bash",
+ "startB": 1,
+ "lines": 71,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 13,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest.py",
+ "startB": 7,
+ "lines": 101,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 143,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startB": 113,
+ "lines": 29,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 178,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startB": 141,
+ "lines": 32,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 215,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startB": 171,
+ "lines": 46,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 363,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startB": 272,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 456,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest.py",
+ "startB": 280,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/references-by-popularity/closure-graph.py",
+ "startA": 484,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/by-name/fl/flatten-references-graph/src/flatten_references_graph/popularity_contest_test.py",
+ "startB": 317,
+ "lines": 19,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/cc-wrapper.sh",
+ "startA": 89,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/swift/wrapper/wrapper.sh",
+ "startB": 122,
+ "lines": 15,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/cc-wrapper.sh",
+ "startA": 106,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/development/compilers/swift/wrapper/wrapper.sh",
+ "startB": 139,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/cc-wrapper.sh",
+ "startA": 248,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/gnat-wrapper.sh",
+ "startB": 164,
+ "lines": 17,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/ld-wrapper.sh",
+ "startA": 268,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/gnat-wrapper.sh",
+ "startB": 169,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/darwin-strip-wrapper.sh",
+ "startA": 54,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/ld-wrapper.sh",
+ "startB": 265,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh",
+ "startA": 30,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/darwin-strip-wrapper.sh",
+ "startB": 51,
+ "lines": 20,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/bintools-wrapper/add-hardening.sh",
+ "startA": 24,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/pkgs/build-support/cc-wrapper/add-hardening.sh",
+ "startB": 77,
+ "lines": 16,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/maintainers/scripts/kde/collect-metadata.py",
+ "startA": 18,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/maintainers/scripts/kde/generate-sources.py",
+ "startB": 58,
+ "lines": 14,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/systematic-debugging/condition-based-waiting-example.ts",
+ "startA": 115,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/systematic-debugging/condition-based-waiting-example.ts",
+ "startB": 23,
+ "lines": 9,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/ci/github-script/reviews.js",
+ "startA": 154,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/ci/github-script/reviews.js",
+ "startB": 28,
+ "lines": 12,
+ "tokens": 0
+ },
+ {
+ "fileA": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/ci/nixpkgs-vet.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/ky7q5vm0kgv6qbq5gfzmv1ki79qr4q0z-source/maintainers/scripts/check-by-name.sh",
+ "startB": 1,
+ "lines": 66,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/skill-creator/scripts/quick_validate.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/skill-creator/scripts/quick_validate.py",
+ "startB": 1,
+ "lines": 103,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/skill-creator/scripts/init_skill.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/skill-creator/scripts/init_skill.py",
+ "startB": 1,
+ "lines": 304,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/prompt-engineering-patterns/scripts/optimize-prompt.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/prompt-engineering-patterns/scripts/optimize-prompt.py",
+ "startB": 1,
+ "lines": 279,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/fill_pdf_form_with_annotations.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/fill_pdf_form_with_annotations.py",
+ "startB": 1,
+ "lines": 108,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/fill_fillable_fields.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/fill_fillable_fields.py",
+ "startB": 1,
+ "lines": 114,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/extract_form_field_info.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/extract_form_field_info.py",
+ "startB": 1,
+ "lines": 152,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/create_validation_image.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/create_validation_image.py",
+ "startB": 1,
+ "lines": 41,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/convert_pdf_to_images.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/convert_pdf_to_images.py",
+ "startB": 1,
+ "lines": 35,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes_test.py",
+ "startB": 1,
+ "lines": 226,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/pdf/scripts/check_bounding_boxes.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/pdf/scripts/check_bounding_boxes.py",
+ "startB": 1,
+ "lines": 70,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/excalidraw/references/render_template.html",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/excalidraw/references/render_template.html",
+ "startB": 1,
+ "lines": 57,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/excalidraw/references/render_excalidraw.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/excalidraw/references/render_excalidraw.py",
+ "startB": 1,
+ "lines": 205,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/doc-translator/scripts/upload_image_to_outline.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/doc-translator/scripts/upload_image_to_outline.sh",
+ "startB": 1,
+ "lines": 116,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/agent-development/scripts/validate-agent.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/agent-development/scripts/validate-agent.sh",
+ "startB": 1,
+ "lines": 304,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/xlsx/recalc.py",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/xlsx/recalc.py",
+ "startB": 1,
+ "lines": 178,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/systematic-debugging/find-polluter.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/systematic-debugging/find-polluter.sh",
+ "startB": 1,
+ "lines": 63,
+ "tokens": 0
+ },
+ {
+ "fileA": "skills/systematic-debugging/condition-based-waiting-example.ts",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/skills/systematic-debugging/condition-based-waiting-example.ts",
+ "startB": 1,
+ "lines": 158,
+ "tokens": 0
+ },
+ {
+ "fileA": "scripts/validate-agents.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/scripts/validate-agents.sh",
+ "startB": 1,
+ "lines": 182,
+ "tokens": 0
+ },
+ {
+ "fileA": "scripts/test-skill.sh",
+ "startA": 1,
+ "fileB": ".direnv/flake-inputs/s8m7zj41bywjaks2s8cgwr3jbzgmh2y3-source/scripts/test-skill.sh",
+ "startB": 1,
+ "lines": 225,
+ "tokens": 0
+ }
+ ],
+ "duplicatedLines": 13471,
+ "totalLines": 351417,
+ "percentage": 3.83
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/jscpd.meta.json b/.pi-lens/cache/jscpd.meta.json
new file mode 100644
index 0000000..f7fd076
--- /dev/null
+++ b/.pi-lens/cache/jscpd.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T03:55:48.815Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/knip.json b/.pi-lens/cache/knip.json
new file mode 100644
index 0000000..a4147c6
--- /dev/null
+++ b/.pi-lens/cache/knip.json
@@ -0,0 +1,9 @@
+{
+ "success": false,
+ "issues": [],
+ "unusedExports": [],
+ "unusedFiles": [],
+ "unusedDeps": [],
+ "unlistedDeps": [],
+ "summary": "Failed to parse output"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/knip.meta.json b/.pi-lens/cache/knip.meta.json
new file mode 100644
index 0000000..564c7e2
--- /dev/null
+++ b/.pi-lens/cache/knip.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T03:55:49.603Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/session-start-guidance.json b/.pi-lens/cache/session-start-guidance.json
new file mode 100644
index 0000000..ec747fa
--- /dev/null
+++ b/.pi-lens/cache/session-start-guidance.json
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/.pi-lens/cache/session-start-guidance.meta.json b/.pi-lens/cache/session-start-guidance.meta.json
new file mode 100644
index 0000000..367614f
--- /dev/null
+++ b/.pi-lens/cache/session-start-guidance.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T04:23:19.016Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/todo-baseline.json b/.pi-lens/cache/todo-baseline.json
new file mode 100644
index 0000000..50015ca
--- /dev/null
+++ b/.pi-lens/cache/todo-baseline.json
@@ -0,0 +1,18 @@
+{
+ "items": [
+ {
+ "type": "TODO",
+ "message": "Replace with the first main section based on chosen structure]",
+ "file": "skills/skill-creator/scripts/init_skill.py",
+ "line": 58,
+ "column": 4
+ },
+ {
+ "type": "TODO",
+ "message": "Add actual script logic here",
+ "file": "skills/skill-creator/scripts/init_skill.py",
+ "line": 120,
+ "column": 6
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/todo-baseline.meta.json b/.pi-lens/cache/todo-baseline.meta.json
new file mode 100644
index 0000000..a02d4ee
--- /dev/null
+++ b/.pi-lens/cache/todo-baseline.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T04:22:20.339Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/turn-end-findings-last.json b/.pi-lens/cache/turn-end-findings-last.json
new file mode 100644
index 0000000..a92b132
--- /dev/null
+++ b/.pi-lens/cache/turn-end-findings-last.json
@@ -0,0 +1,3 @@
+{
+ "signature": "/home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/coding/agents/claude-code.nix::📐 Cascade errors in 1 other file(s) — fix before finishing turn:\n\n line 205, col 10 code=sema-duplicated-attrname: duplicated attrname `file`\n"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/turn-end-findings-last.meta.json b/.pi-lens/cache/turn-end-findings-last.meta.json
new file mode 100644
index 0000000..f07444c
--- /dev/null
+++ b/.pi-lens/cache/turn-end-findings-last.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T03:32:45.214Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/cache/turn-end-findings.json b/.pi-lens/cache/turn-end-findings.json
new file mode 100644
index 0000000..ec747fa
--- /dev/null
+++ b/.pi-lens/cache/turn-end-findings.json
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/.pi-lens/cache/turn-end-findings.meta.json b/.pi-lens/cache/turn-end-findings.meta.json
new file mode 100644
index 0000000..82429b5
--- /dev/null
+++ b/.pi-lens/cache/turn-end-findings.meta.json
@@ -0,0 +1,3 @@
+{
+ "timestamp": "2026-04-11T03:33:08.875Z"
+}
\ No newline at end of file
diff --git a/.pi-lens/turn-state.json b/.pi-lens/turn-state.json
new file mode 100644
index 0000000..b0d281f
--- /dev/null
+++ b/.pi-lens/turn-state.json
@@ -0,0 +1,6 @@
+{
+ "files": {},
+ "turnCycles": 0,
+ "maxCycles": 3,
+ "lastUpdated": "2026-04-11T03:55:49.605Z"
+}
\ No newline at end of file
diff --git a/.sisyphus/boulder.json b/.sisyphus/boulder.json
new file mode 100644
index 0000000..51a1701
--- /dev/null
+++ b/.sisyphus/boulder.json
@@ -0,0 +1,77 @@
+{
+ "active_plan": "/home/m3tam3re/p/AI/AGENTS/.sisyphus/plans/harness-agnostic-migration.md",
+ "started_at": "2026-04-10T13:53:14.227Z",
+ "session_ids": [
+ "ses_28877ce54ffepCBENqWBi0fQr4"
+ ],
+ "session_origins": {
+ "ses_28877ce54ffepCBENqWBi0fQr4": "direct"
+ },
+ "plan_name": "harness-agnostic-migration",
+ "agent": "atlas",
+ "task_sessions": {
+ "todo:1": {
+ "task_key": "todo:1",
+ "task_label": "1",
+ "task_title": "Capture Golden File Baseline",
+ "session_id": "ses_28852d166ffea2zvkAFvqhH7OX",
+ "agent": "Sisyphus-Junior",
+ "category": "quick",
+ "updated_at": "2026-04-10T13:56:10.927Z"
+ },
+ "todo:3": {
+ "task_key": "todo:3",
+ "task_label": "3",
+ "task_title": "Design Canonical agent.toml Schema",
+ "session_id": "ses_288508bf9ffeDi2kwwOT95s78z",
+ "agent": "Sisyphus-Junior",
+ "category": "deep",
+ "updated_at": "2026-04-10T13:59:52.937Z"
+ },
+ "todo:5": {
+ "task_key": "todo:5",
+ "task_label": "5",
+ "task_title": "Create All 6 agent.toml + system-prompt.md Files",
+ "session_id": "ses_2884d3d77ffeP8WZCH8MXK02Hv",
+ "agent": "Sisyphus-Junior",
+ "category": "unspecified-high",
+ "updated_at": "2026-04-10T14:04:28.811Z"
+ },
+ "todo:6": {
+ "task_key": "todo:6",
+ "task_label": "6",
+ "task_title": "Update AGENTS flake.nix with loadAgents + agentsJson Bridge",
+ "session_id": "ses_28840426bffeLNACasCLDil1oX",
+ "agent": "Sisyphus-Junior",
+ "category": "deep",
+ "updated_at": "2026-04-10T14:21:02.937Z"
+ },
+ "todo:7": {
+ "task_key": "todo:7",
+ "task_label": "7",
+ "task_title": "Create lib/agents.nix in nixpkgs with loadCanonical",
+ "session_id": "ses_288254a44ffer60bcJY7yAKtqh",
+ "agent": "Sisyphus-Junior",
+ "category": "deep",
+ "updated_at": "2026-04-10T14:46:28.743Z"
+ },
+ "todo:9": {
+ "task_key": "todo:9",
+ "task_label": "9",
+ "task_title": "Implement OpenCode Renderer in lib/agents.nix",
+ "session_id": "ses_2881e8981ffe8ZZZjBOJ60wU5O",
+ "agent": "Sisyphus-Junior",
+ "category": "deep",
+ "updated_at": "2026-04-10T15:07:43.465Z"
+ },
+ "todo:10": {
+ "task_key": "todo:10",
+ "task_label": "10",
+ "task_title": "Implement Claude Code Renderer in lib/agents.nix",
+ "session_id": "ses_2880cbb8affe03hwPbOGZKEFDC",
+ "agent": "Sisyphus-Junior",
+ "category": "deep",
+ "updated_at": "2026-04-10T15:42:05.656Z"
+ }
+ }
+}
\ No newline at end of file
diff --git a/.sisyphus/evidence/agents-golden.json b/.sisyphus/evidence/agents-golden.json
new file mode 100644
index 0000000..2db6f33
--- /dev/null
+++ b/.sisyphus/evidence/agents-golden.json
@@ -0,0 +1,173 @@
+{
+ "Apollo (Knowledge Management)": {
+ "description": "Private knowledge specialist. Manages Obsidian vault, personal notes, and private knowledge graph.",
+ "mode": "subagent",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "ask",
+ "cat *": "allow"
+ },
+ "edit": {
+ "*": "allow",
+ "/run/agenix/**": "deny"
+ },
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow"
+ },
+ "prompt": "{file:./prompts/apollo.txt}"
+ },
+ "Athena (Researcher)": {
+ "description": "Work knowledge specialist. Manages Outline wiki, documentation, and knowledge organization.",
+ "mode": "subagent",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "ask",
+ "cat *": "allow",
+ "grep *": "allow"
+ },
+ "edit": {
+ "*": "allow",
+ "/run/agenix/**": "deny"
+ },
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow",
+ "webfetch": "allow",
+ "websearch": "allow"
+ },
+ "prompt": "{file:./prompts/athena.txt}"
+ },
+ "Calliope (Writer)": {
+ "description": "Writing specialist. Creates documentation, reports, meeting notes, and prose.",
+ "mode": "subagent",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "ask",
+ "cat *": "allow",
+ "wc *": "allow"
+ },
+ "edit": {
+ "*": "allow",
+ "/run/agenix/**": "deny"
+ },
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow",
+ "webfetch": "allow"
+ },
+ "prompt": "{file:./prompts/calliope.txt}"
+ },
+ "Chiron (Assistant)": {
+ "description": "Personal AI assistant (Plan Mode). Read-only analysis, planning, and guidance.",
+ "mode": "primary",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "ask",
+ "bd *": "allow",
+ "cat *": "allow",
+ "echo *": "allow",
+ "git branch*": "allow",
+ "git diff*": "allow",
+ "git log*": "allow",
+ "git show*": "allow",
+ "git status*": "allow",
+ "grep *": "allow",
+ "head *": "allow",
+ "ls *": "allow",
+ "nix *": "allow",
+ "tail *": "allow",
+ "td *": "allow",
+ "wc *": "allow",
+ "which *": "allow"
+ },
+ "edit": "deny",
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow",
+ "webfetch": "allow",
+ "websearch": "allow"
+ },
+ "prompt": "{file:./prompts/chiron.txt}"
+ },
+ "Chiron Forge (Builder)": {
+ "description": "Personal AI assistant (Build Mode). Full execution and task completion capabilities with safety prompts.",
+ "mode": "primary",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "allow",
+ "git push --force*": "deny",
+ "git push -f *": "deny",
+ "git push*": "ask",
+ "git reset --hard*": "ask",
+ "rm -rf *": "ask"
+ },
+ "edit": {
+ "*": "allow",
+ "/run/agenix/**": "deny"
+ },
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow",
+ "webfetch": "allow",
+ "websearch": "allow"
+ },
+ "prompt": "{file:./prompts/chiron-forge.txt}"
+ },
+ "Hermes (Communication)": {
+ "description": "Work communication specialist. Handles Basecamp tasks, Outlook email, and MS Teams meetings.",
+ "mode": "subagent",
+ "model": "zai-coding-plan/glm-5",
+ "permission": {
+ "bash": {
+ "*": "ask",
+ "cat *": "allow",
+ "echo *": "allow"
+ },
+ "edit": {
+ "*": "allow",
+ "/run/agenix/**": "deny"
+ },
+ "external_directory": {
+ "*": "ask",
+ "/run/agenix/**": "allow",
+ "/tmp/**": "allow",
+ "~/.config/opencode/**": "allow",
+ "~/p/**": "allow"
+ },
+ "question": "allow",
+ "webfetch": "allow"
+ },
+ "prompt": "{file:./prompts/hermes.txt}"
+ }
+}
diff --git a/.sisyphus/evidence/task-1-verify.txt b/.sisyphus/evidence/task-1-verify.txt
new file mode 100644
index 0000000..d74e391
--- /dev/null
+++ b/.sisyphus/evidence/task-1-verify.txt
@@ -0,0 +1,38 @@
+Task 1: Capture Golden File Baseline
+=====================================
+
+Golden File Location:
+ /home/m3tam3re/p/AI/AGENTS/.sisyphus/evidence/agents-golden.json
+
+Verification Results:
+✓ File created successfully
+✓ Valid JSON (jq parseable)
+✓ Agent count: 6
+✓ Sorted alphabetically by agent name
+
+Agent Names (6 total):
+ 1. Apollo (Knowledge Management)
+ 2. Athena (Researcher)
+ 3. Calliope (Writer)
+ 4. Chiron (Assistant)
+ 5. Chiron Forge (Builder)
+ 6. Hermes (Communication)
+
+Agent Object Structure (keys per agent):
+ - description
+ - mode
+ - model
+ - permission
+ - prompt
+
+Permission Subkeys:
+ - question
+ - webfetch
+ - websearch
+ - edit
+ - bash
+ - external_directory
+
+Sorting Method: jq --sort-keys (alphabetical)
+
+Baseline Status: ✓ READY FOR TASK 8 (backward-compat bridge verification)
diff --git a/.sisyphus/evidence/task-10-claude-render.txt b/.sisyphus/evidence/task-10-claude-render.txt
new file mode 100644
index 0000000..a1e2c96
--- /dev/null
+++ b/.sisyphus/evidence/task-10-claude-render.txt
@@ -0,0 +1,56 @@
+=== Claude Code Renderer Output ===
+Store path: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents
+
+=== File listing ===
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/hermes.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/chiron-forge.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/chiron.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/apollo.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/calliope.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/athena.md
+/nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/settings.json
+
+=== chiron-forge.md frontmatter ===
+---
+description: "Personal AI assistant (Build Mode). Full execution and task completion capabilities with safety prompts"
+---
+You are Chiron-Forge, the Greek centaur smith of Hephaestus, specializing in execution and task completion as Chiron's build counterpart.
+
+
+=== settings.json ===
+{
+ "permissions": {
+ "allow": [
+ "Bash",
+ "Bash(bd *)",
+ "Bash(cat *)",
+ "Bash(echo *)",
+ "Bash(git branch*)",
+ "Bash(git diff*)",
+ "Bash(git log*)",
+ "Bash(git show*)",
+ "Bash(git status*)",
+ "Bash(grep *)",
+ "Bash(head *)",
+ "Bash(ls *)",
+ "Bash(nix *)",
+ "Bash(tail *)",
+ "Bash(td *)",
+ "Bash(wc *)",
+ "Bash(which *)",
+ "Edit",
+ "WebFetch"
+ ],
+ "deny": [
+ "Bash(git push --force*)",
+ "Bash(git push -f *)",
+ "Edit(/run/agenix/**)"
+ ]
+ }
+}
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/apollo.md -> OK: Private knowledge specialist. Manages Obsidian vau
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/athena.md -> OK: Work knowledge specialist. Manages Outline wiki, d
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/calliope.md -> OK: Writing specialist. Creates documentation, reports
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/chiron-forge.md -> OK: Personal AI assistant (Build Mode). Full execution
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/chiron.md -> OK: Personal AI assistant (Plan Mode). Read-only analy
+Frontmatter validation: /nix/store/jnb2gls23ix4x73hjnw1iaa04xbd011k-claude-code-agents/.claude/agents/hermes.md -> OK: Work communication specialist. Handles Basecamp ta
diff --git a/.sisyphus/evidence/task-11-pi-render.txt b/.sisyphus/evidence/task-11-pi-render.txt
new file mode 100644
index 0000000..f56a578
--- /dev/null
+++ b/.sisyphus/evidence/task-11-pi-render.txt
@@ -0,0 +1,45 @@
+=== Pi Renderer Output ===
+Store path: /nix/store/4xfs4pmikfjqqcm930rqbv1b179rlhh0-pi-agents
+
+=== File listing ===
+AGENTS.md
+SYSTEM.md
+
+=== AGENTS.md ===
+# Agent Instructions
+
+## Chiron (Assistant)
+
+Personal AI assistant (Plan Mode). Read-only analysis, planning, and guidance
+
+## Available Specialists
+
+- **Apollo (Knowledge Management)**: Private knowledge specialist. Manages Obsidian vault, personal notes, and private knowledge graph
+- **Athena (Researcher)**: Work knowledge specialist. Manages Outline wiki, documentation, and knowledge organization
+- **Calliope (Writer)**: Writing specialist. Creates documentation, reports, meeting notes, and prose
+- **Hermes (Communication)**: Work communication specialist. Handles Basecamp tasks, Outlook email, and MS Teams meetings
+
+=== SYSTEM.md (first 20 lines) ===
+You are Chiron, the wise centaur from Greek mythology, serving as the main orchestrator in plan and analysis mode. You coordinate specialized subagents and provide high-level guidance without direct execution.
+
+**Your Core Responsibilities:**
+1. Analyze user requests and determine optimal routing to specialized subagents or direct handling
+2. Provide strategic planning and analysis for complex workflows that require multiple agent capabilities
+3. Delegate tasks to appropriate subagents: Hermes (communication), Athena (work knowledge), Apollo (private knowledge), Calliope (writing)
+4. Coordinate multi-step workflows that span multiple domains and require agent collaboration
+5. Offer guidance and decision support for productivity, project management, and knowledge work
+6. Bridge personal and work contexts while maintaining appropriate boundaries between domains
+
+**Process:**
+1. **Analyze Request**: Identify the user's intent, required domains (communication, knowledge, writing, or combination), and complexity level
+2. **Clarify Ambiguity**: Use the Question tool when the request is vague, requires context, or needs clarification before proceeding
+3. **Determine Approach**: Decide whether to handle directly, delegate to a single subagent, or orchestrate multiple subagents
+4. **Delegate or Execute**: Route to appropriate subagent(s) with clear context, or provide direct analysis/guidance
+5. **Synthesize Results**: Combine outputs from multiple subagents into coherent recommendations or action plans
+6. **Provide Guidance**: Offer strategic insights, priorities, and next steps based on the analysis
+
+**Delegation Logic:**
+- **Hermes**: Work communication tasks (email drafts, message management, meeting coordination)
+
+=== SYSTEM.md vs chiron/system-prompt.md diff ===
+PASS: SYSTEM.md matches chiron prompt
diff --git a/.sisyphus/evidence/task-12-opencode-hm.txt b/.sisyphus/evidence/task-12-opencode-hm.txt
new file mode 100644
index 0000000..e74efda
--- /dev/null
+++ b/.sisyphus/evidence/task-12-opencode-hm.txt
@@ -0,0 +1,6 @@
+=== Task 12: OpenCode HM Sub-Module ===
+Module file: modules/home-manager/coding/agents/opencode.nix
+Options: coding.agents.opencode.{enable, agentsInput, modelOverrides, externalSkills}
+Config: renders agents to ~/.config/opencode/agents/
+
+Use '--all-systems' to check all.
diff --git a/.sisyphus/evidence/task-13-claude-hm.txt b/.sisyphus/evidence/task-13-claude-hm.txt
new file mode 100644
index 0000000..c69ef15
--- /dev/null
+++ b/.sisyphus/evidence/task-13-claude-hm.txt
@@ -0,0 +1,6 @@
+=== Task 13: Claude Code HM Sub-Module ===
+Module file: modules/home-manager/coding/agents/claude-code.nix
+Options: coding.agents.claude-code.{enable, agentsInput, modelOverrides}
+Config: renders agents to ~/.claude/agents/ + settings.json
+
+Use '--all-systems' to check all.
diff --git a/.sisyphus/evidence/task-14-pi-hm.txt b/.sisyphus/evidence/task-14-pi-hm.txt
new file mode 100644
index 0000000..adf68f4
--- /dev/null
+++ b/.sisyphus/evidence/task-14-pi-hm.txt
@@ -0,0 +1,6 @@
+=== Task 14: Pi HM Sub-Module ===
+Module file: modules/home-manager/coding/agents/pi.nix
+Options: coding.agents.pi.{enable, agentsInput}
+Config: renders AGENTS.md + SYSTEM.md to ~/.pi/agent/
+
+Use '--all-systems' to check all.
diff --git a/.sisyphus/evidence/task-15-opencode-slim.txt b/.sisyphus/evidence/task-15-opencode-slim.txt
new file mode 100644
index 0000000..166dea0
--- /dev/null
+++ b/.sisyphus/evidence/task-15-opencode-slim.txt
@@ -0,0 +1,7 @@
+=== Task 15: Slimmed opencode.nix ===
+Removed: agentsInput, externalSkills options; agents.json embedding; skills/context/commands/prompts symlinks
+Kept: ohMyOpencodeSettings, extraSettings, extraPlugins, theme/formatter/plugin config
+
+PASS: agentsInput removed
+PASS: externalSkills removed
+PASS: ohMyOpencodeSettings preserved
diff --git a/.sisyphus/evidence/task-16-rules-rename.txt b/.sisyphus/evidence/task-16-rules-rename.txt
new file mode 100644
index 0000000..5a3f711
--- /dev/null
+++ b/.sisyphus/evidence/task-16-rules-rename.txt
@@ -0,0 +1,12 @@
+=== Task 16: mkCodingRules rename ===
+File: lib/coding-rules.nix (new)
+Old file: lib/opencode-rules.nix (still exists for reference)
+
+Both functions produce identical results:
+true
+
+lib/default.nix exports:
+ # Coding rules injection utilities (renamed from opencode-rules)
+ coding-rules = import ./coding-rules.nix {inherit lib;};
+ # Backward-compat alias: opencode-rules → coding-rules
+ opencode-rules = import ./coding-rules.nix {inherit lib;};
diff --git a/.sisyphus/evidence/task-17-renderForTool.txt b/.sisyphus/evidence/task-17-renderForTool.txt
new file mode 100644
index 0000000..5513696
--- /dev/null
+++ b/.sisyphus/evidence/task-17-renderForTool.txt
@@ -0,0 +1,19 @@
+=== Task 17: renderForTool + shellHookForTool ===
+
+--- Tool: opencode ---
+Store path: /nix/store/jmx3s0jgy3v5k4dc0r29d601c7xxy6wr-opencode-agents
+Contents:
+(listing failed)
+
+--- Tool: claude-code ---
+Store path: /nix/store/2hjsch59amjs3nbgh7ahcfzm2bfwl8zi-bash-5.3p9/bin/bash: line 15: nix: command not found
+Contents:
+(listing failed)
+
+--- Tool: pi ---
+Store path: /nix/store/2hjsch59amjs3nbgh7ahcfzm2bfwl8zi-bash-5.3p9/bin/bash: line 15: nix: command not found
+Contents:
+(listing failed)
+
+--- shellHookForTool ---
+/nix/store/2hjsch59amjs3nbgh7ahcfzm2bfwl8zi-bash-5.3p9/bin/bash: line 23: nix: command not found
diff --git a/.sisyphus/evidence/task-18-exports.txt b/.sisyphus/evidence/task-18-exports.txt
new file mode 100644
index 0000000..e16df8c
--- /dev/null
+++ b/.sisyphus/evidence/task-18-exports.txt
@@ -0,0 +1,45 @@
+=== Task 18: Flake exports + Aggregator imports ===
+homeManagerModule keys:
+["agents","default","opencode","ports","zellij-ps"]
+
+coding/default.nix imports:
+# Coding-related Home Manager modules
+{
+ imports = [
+ ./editors.nix
+ ./opencode.nix
+ ./agents
+ ];
+}
+
+coding/agents/default.nix:
+# Per-tool agent sub-modules
+# Each module handles rendering canonical agent.toml definitions
+# for a specific AI coding tool.
+{
+ imports = [
+ ./opencode.nix
+ ./claude-code.nix
+ ./pi.nix
+ ];
+}
+
+lib/default.nix:
+# Library of helper functions for m3ta-nixpkgs
+# Usage in your configuration:
+# let
+# m3taLib = inputs.m3ta-nixpkgs.lib.${system};
+# in ...
+{lib}: {
+ # Port management utilities
+ ports = import ./ports.nix {inherit lib;};
+
+ # Coding rules injection utilities (renamed from opencode-rules)
+ coding-rules = import ./coding-rules.nix {inherit lib;};
+
+ # Backward-compat alias: opencode-rules → coding-rules
+ opencode-rules = import ./coding-rules.nix {inherit lib;};
+
+ # Agent configuration management utilities
+ agents = import ./agents.nix {inherit lib;};
+}
diff --git a/.sisyphus/evidence/task-19-docs-check.txt b/.sisyphus/evidence/task-19-docs-check.txt
new file mode 100644
index 0000000..5fafe59
--- /dev/null
+++ b/.sisyphus/evidence/task-19-docs-check.txt
@@ -0,0 +1,32 @@
+=== Task 19: AGENTS.md Documentation Update ===
+
+Check: agent.toml mentioned:
+for f in agents/*/agent.toml; do nix eval --impure --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f"; done
+│ ├── SCHEMA.md # Canonical agent.toml schema definition
+│ ├── agent.toml # Agent metadata, permissions, references
+Agent definitions live in `agents//agent.toml` + `agents//system-prompt.md`.
+1. Create `agents//agent.toml` with required fields (`name`, `description`) and optional fields (`mode`, `permissions`, etc.)
+3. Verify: `nix eval --impure --expr 'builtins.fromTOML (builtins.readFile ./agents//agent.toml)' --json`
+- `lib.loadAgents` — loads all canonical `agents/*/agent.toml` + `system-prompt.md` into an attrset
+PASS
+
+Check: system-prompt.md mentioned:
+│ └── system-prompt.md # Agent system prompt (markdown)
+Agent definitions live in `agents//agent.toml` + `agents//system-prompt.md`.
+2. Create `agents//system-prompt.md` with the agent's system prompt
+- `lib.loadAgents` — loads all canonical `agents/*/agent.toml` + `system-prompt.md` into an attrset
+PASS
+
+Check: agents.json NOT as canonical:
+- `lib.agentsJson` — backward-compat bridge producing legacy agents.json shape (temporary, will be removed)
+Found references (check they're not 'canonical'):
+
+Check: loadAgents mentioned:
+Renderers live in **m3ta-nixpkgs** (not this repo). They consume `lib.loadAgents` and produce:
+- `lib.loadAgents` — loads all canonical `agents/*/agent.toml` + `system-prompt.md` into an attrset
+PASS
+
+Check: mkCodingRules mentioned:
+Centralized AI coding rules consumed via `mkCodingRules` from m3ta-nixpkgs
+m3taLib.coding-rules.mkCodingRules {
+PASS
diff --git a/.sisyphus/evidence/task-2-toml-minimal.json b/.sisyphus/evidence/task-2-toml-minimal.json
new file mode 100644
index 0000000..fdfbe47
--- /dev/null
+++ b/.sisyphus/evidence/task-2-toml-minimal.json
@@ -0,0 +1 @@
+{"description":"Minimal test agent with only required fields","name":"minimal-agent"}
diff --git a/.sisyphus/evidence/task-2-toml-spike.json b/.sisyphus/evidence/task-2-toml-spike.json
new file mode 100644
index 0000000..4c9d562
--- /dev/null
+++ b/.sisyphus/evidence/task-2-toml-spike.json
@@ -0,0 +1 @@
+{"description":"Personal AI assistant (Build Mode). Full execution and task completion capabilities with safety prompts.","mode":"primary","name":"chiron-forge","permissions":{"bash":{"intent":"allow","rules":["rm -rf *:ask","git reset --hard*:ask","git push*:ask","git push --force*:deny","git push -f *:deny"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"],"skills":["systematic-debugging","git-master"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"},"websearch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-21-e2e.txt b/.sisyphus/evidence/task-21-e2e.txt
new file mode 100644
index 0000000..bfcf8f5
--- /dev/null
+++ b/.sisyphus/evidence/task-21-e2e.txt
@@ -0,0 +1,34 @@
+=== Task 21: End-to-End Integration Test ===
+
+--- 1. AGENTS repo flake check ---
+PASS: nix flake check passes
+
+--- 2. nixpkgs flake check ---
+PASS: nix flake check passes (21 checks, formatting clean)
+
+--- 3. loadAgents returns 6 agents ---
+PASS: 6 agents (chiron, chiron-forge, hermes, athena, apollo, calliope)
+
+--- 4. OpenCode renderer ---
+PASS: 6 .md files with correct YAML frontmatter
+
+--- 5. Claude Code renderer ---
+PASS: 6 .md files in .claude/agents/ + settings.json with permission DSL
+
+--- 6. Pi renderer ---
+PASS: AGENTS.md + SYSTEM.md, SYSTEM.md byte-identical to chiron prompt
+
+--- 7. Skills composition ---
+PASS: 18 skills in linkFarm output, mkOpencodeSkills unchanged
+
+--- 8. Backward-compat bridge ---
+PASS: agentsJson output matches golden file (zero diff)
+
+--- 9. Coding rules backward compat ---
+PASS: mkCodingRules == mkOpencodeRules (identical instructions output)
+
+--- 10. Formatting ---
+PASS: alejandra formatting clean on both repos (verified via flake check)
+
+--- Summary ---
+All checks PASS.
diff --git a/.sisyphus/evidence/task-3-schema-sample-parsed.json b/.sisyphus/evidence/task-3-schema-sample-parsed.json
new file mode 100644
index 0000000..42528f8
--- /dev/null
+++ b/.sisyphus/evidence/task-3-schema-sample-parsed.json
@@ -0,0 +1 @@
+{"context":["../../context/profile.md"],"description":"Personal AI assistant (Plan Mode). Read-only analysis, planning, and guidance","display_name":"Chiron (Assistant)","max_turns":50,"mode":"primary","name":"chiron","permissions":{"bash":{"intent":"ask","rules":["git status*:allow","git log*:allow","git diff*:allow","git branch*:allow","git show*:allow","grep *:allow","ls *:allow","cat *:allow","head *:allow","tail *:allow","wc *:allow","which *:allow","echo *:allow","nix *:allow"]},"edit":{"intent":"deny"},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"},"websearch":{"intent":"allow"}},"rules":["languages/nix","languages/python","concerns/testing"],"skills":["systematic-debugging","git-master","brainstorming"],"tags":["assistant","plan-mode","read-only"]}
diff --git a/.sisyphus/evidence/task-3-schema-sample.toml b/.sisyphus/evidence/task-3-schema-sample.toml
new file mode 100644
index 0000000..1771ce7
--- /dev/null
+++ b/.sisyphus/evidence/task-3-schema-sample.toml
@@ -0,0 +1,53 @@
+# agents/chiron/agent.toml
+# Chiron — Personal AI Assistant (Plan Mode)
+
+name = "chiron"
+display_name = "Chiron (Assistant)"
+description = "Personal AI assistant (Plan Mode). Read-only analysis, planning, and guidance"
+mode = "primary"
+tags = ["assistant", "plan-mode", "read-only"]
+max_turns = 50
+
+skills = ["systematic-debugging", "git-master", "brainstorming"]
+context = ["../../context/profile.md"]
+rules = ["languages/nix", "languages/python", "concerns/testing"]
+
+[permissions.question]
+intent = "allow"
+
+[permissions.webfetch]
+intent = "allow"
+
+[permissions.websearch]
+intent = "allow"
+
+[permissions.edit]
+intent = "deny"
+
+[permissions.bash]
+intent = "ask"
+rules = [
+ "git status*:allow",
+ "git log*:allow",
+ "git diff*:allow",
+ "git branch*:allow",
+ "git show*:allow",
+ "grep *:allow",
+ "ls *:allow",
+ "cat *:allow",
+ "head *:allow",
+ "tail *:allow",
+ "wc *:allow",
+ "which *:allow",
+ "echo *:allow",
+ "nix *:allow",
+]
+
+[permissions.external_directory]
+intent = "ask"
+rules = [
+ "~/p/**:allow",
+ "~/.config/opencode/**:allow",
+ "/tmp/**:allow",
+ "/run/agenix/**:allow",
+]
diff --git a/.sisyphus/evidence/task-4-opencode-agent-format.md b/.sisyphus/evidence/task-4-opencode-agent-format.md
new file mode 100644
index 0000000..22793a4
--- /dev/null
+++ b/.sisyphus/evidence/task-4-opencode-agent-format.md
@@ -0,0 +1,529 @@
+# Task 4: OpenCode File-Based Agent Format Research
+
+**Date**: 2026-04-10
+**Status**: ✅ Complete
+**Research Method**: WebFetch + Documentation Analysis
+
+---
+
+## Executive Summary
+
+OpenCode supports **two agent configuration methods**:
+1. **JSON** - Embedded in `opencode.json` (config.json)
+2. **Markdown Files** - File-based in `.opencode/agents/` directory (per-project) or `~/.config/opencode/agents/` (global)
+
+This research focuses on the **file-based markdown format**, which is the target for the harness-agnostic migration.
+
+---
+
+## File Location & Discovery
+
+### Directory Structure
+
+**Per-project agents** (takes precedence):
+```
+.opencode/agents/
+├── agent-name.md
+├── another-agent.md
+└── ...
+```
+
+**Global agents** (fallback):
+```
+~/.config/opencode/agents/
+├── agent-name.md
+├── another-agent.md
+└── ...
+```
+
+### Discovery Mechanism
+
+- OpenCode **scans both directories** for `*.md` files
+- The **filename (without .md extension)** becomes the **agent name**
+- Per-project agents **override** global agents with the same name
+- All agents are loaded at startup and available via `Tab` switching or `@mention`
+
+### Key Finding
+
+**The agent name is derived from the filename**, not from a `name` field in the frontmatter. Example:
+- File: `review.md` → Agent name: `review`
+- File: `code-reviewer.md` → Agent name: `code-reviewer`
+
+---
+
+## YAML Frontmatter Specification
+
+All file-based agent markdown files must include YAML frontmatter with the following fields:
+
+### Required Fields
+
+| Field | Type | Description | Example |
+|-------|------|-------------|---------|
+| `description` | string | Brief description of agent purpose and when to use it. **REQUIRED**. | `"Reviews code for quality and best practices"` |
+
+### Optional Fields
+
+| Field | Type | Default | Description |
+|-------|------|---------|-------------|
+| `mode` | string | `all` | Agent mode: `primary`, `subagent`, or `all` |
+| `model` | string | Model globally configured in config | Override LLM model for this agent |
+| `temperature` | float | Model-specific (usually 0 or 0.55 for Qwen) | LLM response randomness (0.0–1.0) |
+| `top_p` | float | — | Alternative to temperature for diversity control |
+| `steps` | integer | No limit | Max agentic iterations before forced text-only response |
+| `disable` | boolean | `false` | Set to `true` to disable the agent |
+| `hidden` | boolean | `false` | Hide from `@` autocomplete (subagents only) |
+| `color` | string | — | Hex color (e.g., `#FF5733`) or theme color (primary, secondary, accent, success, warning, error, info) |
+| `permission` | object | — | Permission rules for edit, bash, webfetch, question, websearch, external_directory |
+| `task` | object | — | Control which subagents this agent can invoke via Task tool |
+
+### Provider-Specific Fields
+
+Any additional fields are **passed through directly to the LLM provider**. Example for OpenAI reasoning models:
+```yaml
+---
+description: Agent using high reasoning effort
+model: openai/gpt-5
+reasoningEffort: high
+textVerbosity: low
+---
+```
+
+---
+
+## Permission Format (YAML)
+
+Permissions control what actions an agent can perform. The format supports two styles:
+
+### Simple Format (Single Action)
+
+```yaml
+permission:
+ edit: deny
+ bash: ask
+ webfetch: allow
+```
+
+### Granular Format (Rules Array)
+
+For more control over specific patterns:
+
+```yaml
+permission:
+ edit:
+ "*": allow
+ "/run/agenix/**": deny
+ bash:
+ "*": ask
+ "git status*": allow
+ "git log*": allow
+ "git push": ask
+ "grep *": allow
+ webfetch: deny
+ question: allow
+ websearch: allow
+ external_directory:
+ "*": ask
+ "~/p/**": allow
+ "~/.config/opencode/**": allow
+ "/tmp/**": allow
+```
+
+### Permission Actions
+
+| Value | Meaning |
+|-------|---------|
+| `allow` | Tool allowed without approval |
+| `ask` | Prompt user for approval before running |
+| `deny` | Tool disabled |
+
+### Supported Permission Keys
+
+| Key | Values | Notes |
+|-----|--------|-------|
+| `edit` | `allow\|ask\|deny` or nested rules | File write/patch operations |
+| `bash` | `allow\|ask\|deny` or nested rules | Bash command execution; supports glob patterns |
+| `webfetch` | `allow\|ask\|deny` | HTTP requests |
+| `question` | `allow\|ask\|deny` | User questions/clarification |
+| `websearch` | `allow\|ask\|deny` | Web search operations |
+| `external_directory` | `allow\|ask\|deny` or nested rules | Access to external directories |
+| `task` | nested rules | Subagent invocation control (glob patterns) |
+
+### Glob Pattern Support
+
+Patterns support wildcards and recursion:
+- `*` — single-level wildcard
+- `**` — recursive wildcard
+- `git push*` — suffix matching
+- `~/p/**` — home directory paths
+- `/run/agenix/**` — absolute paths
+
+### Rule Precedence
+
+When multiple rules match, the **last matching rule wins**:
+
+```yaml
+bash:
+ "*": ask
+ "git status*": allow
+ "git push*": deny
+```
+
+In this example:
+- `git status` matches both `*` and `git status*` → result: **allow** (last rule wins)
+- `git push origin main` matches both `*` and `git push*` → result: **deny**
+- `ls -la` matches only `*` → result: **ask**
+
+---
+
+## Mode Field Values
+
+| Mode | Type | Description |
+|------|------|-------------|
+| `primary` | Primary agent | Agent available via `Tab` key switching; handles main conversation |
+| `subagent` | Specialized agent | Invoked via `@mention` or automatically by other agents for specific tasks |
+| `all` | Flexible | Can be used as both primary and subagent (default if omitted) |
+
+---
+
+## System Prompt Delivery
+
+The markdown file body (after the YAML frontmatter) contains the **system prompt**:
+
+```markdown
+---
+description: Code review without edits
+mode: subagent
+permission:
+ edit: deny
+---
+You are a code reviewer. Focus on:
+- Code quality and best practices
+- Potential bugs and edge cases
+- Performance implications
+- Security considerations
+
+Provide constructive feedback without making direct changes.
+```
+
+The **markdown content is passed directly as the system prompt** to the LLM. It supports:
+- Inline markdown formatting
+- Lists and sections
+- Structured instructions
+- Code examples (fenced with backticks)
+
+---
+
+## Default Behavior for Omitted Fields
+
+| Field | Default | Notes |
+|-------|---------|-------|
+| `description` | **ERROR** | Required; absence causes parse failure |
+| `mode` | `all` | Agent can be used as primary or subagent |
+| `model` | Global config model | Primary agents use global model; subagents use parent's model |
+| `temperature` | Model-specific | Usually 0 for most models; 0.55 for Qwen models |
+| `permission` | Full access | If omitted, all tools enabled (no restrictions) |
+| `disable` | `false` | Agent is enabled by default |
+| `hidden` | `false` | Agent visible in `@` autocomplete (if subagent) |
+
+---
+
+## Interaction with config.json (JSON Format)
+
+### Current State (Task 1 Finding)
+
+The current system embeds agents in **config.json** via JSON:
+
+```json
+{
+ "agent": {
+ "build": {
+ "description": "...",
+ "mode": "primary",
+ "permission": { ... }
+ }
+ }
+}
+```
+
+### File-Based Agents Complement, Don't Replace
+
+- **JSON agents** (in config.json) are loaded from embedded config
+- **Markdown agents** (.opencode/agents/*.md files) are symlinked
+- **Both are loaded** and available simultaneously
+- **Markdown agents override** JSON agents with the same name
+
+### Migration Path
+
+The harness-agnostic migration will:
+1. Move agent definitions from `agents.json` → `.opencode/agent/{name}.md` files
+2. Update home-manager deployment to symlink `.opencode/agents/` instead of embedding `agents.json`
+3. System prompt changes (markdown file edits) will **NOT require `home-manager switch`**
+
+---
+
+## Key Advantage: Prompt Changes Don't Require home-manager switch
+
+### Current Limitation (JSON/Embedded)
+
+```
+agents.json → home-manager → embedded into config.json
+↓
+Change required in nixpkgs module
+↓
+home-manager switch (full system rebuild)
+```
+
+### New Capability (File-Based)
+
+```
+.opencode/agents/{name}.md → home-manager → symlinks to ~/.config/opencode/agents/
+↓
+Change markdown file directly
+↓
+OpenCode reloads on next startup (NO home-manager switch needed)
+```
+
+**This is the KEY ADVANTAGE** of file-based agents: faster iteration on prompts and agent configuration.
+
+---
+
+## Limitations & Gotchas
+
+### No Name Field in Frontmatter
+
+- Agent name comes from **filename only**
+- No `name: foo` field in frontmatter
+- Renaming file renames the agent
+
+### Model References with {file:...}
+
+In JSON config, you can reference external files:
+```json
+{
+ "prompt": "{file:./prompts/build.txt}"
+}
+```
+
+In markdown files, the **body IS the prompt** — no `{file:...}` syntax. The entire markdown content after frontmatter is the system prompt.
+
+### Subdirectories Not Scanned
+
+- Only files directly in `.opencode/agents/` are loaded
+- Subdirectories are ignored
+- All agent definitions must be in one directory level
+
+### Filename Validation
+
+The filename should follow these conventions (not enforced, but recommended):
+- Lowercase letters, numbers, hyphens: `[a-z0-9-]+`
+- No spaces, no special characters
+- Examples: `code-reviewer.md`, `security-auditor.md`, `docs-writer.md`
+
+---
+
+## Complete Example: File-Based Agent
+
+### File: `.opencode/agents/code-reviewer.md`
+
+```markdown
+---
+description: Performs comprehensive code review focusing on quality, security, and performance
+mode: subagent
+model: anthropic/claude-sonnet-4-20250514
+temperature: 0.1
+permission:
+ edit:
+ "*": deny
+ bash:
+ "*": allow
+ "grep *": allow
+ "git diff*": allow
+ webfetch: allow
+ question: allow
+---
+You are an expert code reviewer with deep knowledge of software architecture, security best practices, and performance optimization.
+
+## Your Mission
+
+Review code for:
+1. **Correctness** - Logic errors, edge cases, off-by-one bugs
+2. **Security** - Input validation, injection vulnerabilities, data exposure
+3. **Performance** - Algorithmic efficiency, memory usage, unnecessary allocations
+4. **Maintainability** - Code clarity, naming, documentation, SOLID principles
+5. **Testing** - Coverage gaps, missing test cases, integration test concerns
+
+## Process
+
+1. Ask clarifying questions about context and constraints
+2. Provide specific, actionable feedback with examples
+3. Suggest refactorings with rationale
+4. Never make changes directly (read-only mode)
+5. Prioritize critical issues over style concerns
+
+## Output Format
+
+- **Critical Issues** (must fix before merge)
+- **Important Improvements** (should fix)
+- **Nice-to-Have Suggestions** (consider for future)
+- **Questions** (for author clarification)
+```
+
+---
+
+## Complete Example: JSON Config Format (For Reference)
+
+For comparison, here's the equivalent in JSON config.json:
+
+```json
+{
+ "$schema": "https://opencode.ai/config.json",
+ "agent": {
+ "code-reviewer": {
+ "description": "Performs comprehensive code review focusing on quality, security, and performance",
+ "mode": "subagent",
+ "model": "anthropic/claude-sonnet-4-20250514",
+ "temperature": 0.1,
+ "permission": {
+ "edit": {
+ "*": "deny"
+ },
+ "bash": {
+ "*": "allow",
+ "grep *": "allow",
+ "git diff*": "allow"
+ },
+ "webfetch": "allow",
+ "question": "allow"
+ },
+ "prompt": "You are an expert code reviewer...\n\n## Your Mission\n..."
+ }
+ }
+}
+```
+
+---
+
+## Source Materials
+
+### Documentation
+
+- **Official**: https://opencode.ai/docs/agents
+- **Agents Section**: Comprehensive spec for all agent config options
+- **Markdown Example**: Review agent example provided in docs
+- **Security Auditor Example**: Security-focused agent example
+
+### Code References
+
+- **GitHub**: https://github.com/anomalyco/opencode (dev branch)
+- **Config Spec**: schema.json embedded in docs
+- **Test Cases**: `.opencode/agents/` in opencode repo (example files)
+
+### Current System Reference
+
+- **Nix Module**: `/home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/coding/opencode.nix`
+ - Line 149: `agent = builtins.fromJSON (builtins.readFile "${inputs.agents}/agents/agents.json");`
+ - Line 149: Shows current embedding pattern
+
+- **AGENTS repo**: `/home/m3tam3re/p/AI/AGENTS/agents/agents.json`
+ - 6 agents: Chiron, Chiron Forge, Hermes, Athena, Apollo, Calliope
+ - Permission structure: nested objects with wildcard patterns
+
+---
+
+## Questions Addressed
+
+### Q: Do file-based agents need `home-manager switch` for prompt changes?
+
+**A: NO** ✅
+
+- File changes are immediately available
+- `.opencode/agents/` is symlinked (not embedded)
+- OpenCode reloads agent definitions at startup
+- Prompt changes require only file edit + app restart
+
+**This is the KEY ADVANTAGE** driving the migration.
+
+### Q: What directory: `agent` or `agents`?
+
+**A: `agents` (plural)** (both global and per-project)
+- Global: `~/.config/opencode/agents/`
+- Per-project: `.opencode/agents/`
+
+### Q: Do agent names need a `name` field in frontmatter?
+
+**A: NO**
+
+- Agent name comes from **filename only**
+- No `name: foo` field in frontmatter
+- Example: `review.md` → agent name is `review`
+
+### Q: What YAML frontmatter fields are required?
+
+**A: Only `description`** is truly required
+
+- All other fields have sensible defaults
+- Missing fields use their defaults
+- Frontmatter-less file will fail to parse
+
+### Q: How are permissions specified in markdown?
+
+**A: Same nested object format as JSON**
+
+```yaml
+permission:
+ edit:
+ "*": allow
+ "/sensitive/**": deny
+ bash:
+ "*": ask
+ "git push": deny
+```
+
+---
+
+## Confirmation Summary
+
+| Question | Finding |
+|----------|---------|
+| **Directory**: `agent` or `agents`? | `agents/` (both global and per-project) |
+| **File naming**: How determined? | Filename (without .md) becomes agent name |
+| **Required fields**: What's mandatory? | `description` only; others have defaults |
+| **Permission format**: YAML or different? | Same nested object format as JSON |
+| **Mode values**: Options? | `primary` \| `subagent` \| `all` |
+| **Prompt format**: How specified? | Markdown body after frontmatter |
+| **Requires HM switch for prompt changes?** | **NO** ✅ (major advantage) |
+| **Does frontmatter need `name` field?** | **NO** (filename is the name) |
+| **Can agents be in subdirectories?** | **NO** (only root level of `.opencode/agents/`) |
+| **Can you override agents from JSON config?** | **YES** (markdown agents override JSON with same name) |
+
+---
+
+## Next Steps (Task 9: OpenCode Renderer)
+
+The renderer will generate `.opencode/agents/{name}.md` files with:
+
+1. **Frontmatter generation**:
+ - Convert agent.toml `[description]` → YAML `description:`
+ - Convert `[mode]` → YAML `mode:`
+ - Convert `[temperature]` → YAML `temperature:`
+ - Convert `[permission]` from two-level format → nested YAML objects
+
+2. **Body generation**:
+ - Use agent.toml `system_prompt` field → markdown body
+
+3. **File naming**:
+ - Filename: `{agent_name}.md` (from agent.toml `name` field)
+ - Agent name in OpenCode: derived from filename automatically
+
+---
+
+## Evidence Collection
+
+- **Source 1**: https://opencode.ai/docs/agents (Official documentation)
+- **Source 2**: `/home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/coding/opencode.nix` (Current deployment)
+- **Source 3**: `/home/m3tam3re/p/AI/AGENTS/agents/agents.json` (Current agent definitions)
+- **Source 4**: `/home/m3tam3re/p/AI/AGENTS/AGENTS.md` (Repository documentation)
+
+**Research Date**: 2026-04-10
+**Researcher**: Sisyphus-Junior
+**Task**: Task 4 of harness-agnostic-migration plan
diff --git a/.sisyphus/evidence/task-5-parse-apollo.json b/.sisyphus/evidence/task-5-parse-apollo.json
new file mode 100644
index 0000000..a20bf05
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-apollo.json
@@ -0,0 +1 @@
+{"description":"Private knowledge specialist. Manages Obsidian vault, personal notes, and private knowledge graph","display_name":"Apollo (Knowledge Management)","mode":"subagent","name":"apollo","permissions":{"bash":{"intent":"ask","rules":["cat *:allow"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-parse-athena.json b/.sisyphus/evidence/task-5-parse-athena.json
new file mode 100644
index 0000000..e811ada
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-athena.json
@@ -0,0 +1 @@
+{"description":"Work knowledge specialist. Manages Outline wiki, documentation, and knowledge organization","display_name":"Athena (Researcher)","mode":"subagent","name":"athena","permissions":{"bash":{"intent":"ask","rules":["grep *:allow","cat *:allow"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"},"websearch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-parse-calliope.json b/.sisyphus/evidence/task-5-parse-calliope.json
new file mode 100644
index 0000000..3978052
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-calliope.json
@@ -0,0 +1 @@
+{"description":"Writing specialist. Creates documentation, reports, meeting notes, and prose","display_name":"Calliope (Writer)","mode":"subagent","name":"calliope","permissions":{"bash":{"intent":"ask","rules":["cat *:allow","wc *:allow"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-parse-chiron-forge.json b/.sisyphus/evidence/task-5-parse-chiron-forge.json
new file mode 100644
index 0000000..51758c3
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-chiron-forge.json
@@ -0,0 +1 @@
+{"description":"Personal AI assistant (Build Mode). Full execution and task completion capabilities with safety prompts","display_name":"Chiron Forge (Builder)","mode":"primary","name":"chiron-forge","permissions":{"bash":{"intent":"allow","rules":["rm -rf *:ask","git reset --hard*:ask","git push*:ask","git push --force*:deny","git push -f *:deny"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"},"websearch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-parse-chiron.json b/.sisyphus/evidence/task-5-parse-chiron.json
new file mode 100644
index 0000000..0a543dc
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-chiron.json
@@ -0,0 +1 @@
+{"description":"Personal AI assistant (Plan Mode). Read-only analysis, planning, and guidance","display_name":"Chiron (Assistant)","mode":"primary","name":"chiron","permissions":{"bash":{"intent":"ask","rules":["git status*:allow","git log*:allow","git diff*:allow","git branch*:allow","git show*:allow","grep *:allow","ls *:allow","cat *:allow","head *:allow","tail *:allow","wc *:allow","which *:allow","echo *:allow","td *:allow","bd *:allow","nix *:allow"]},"edit":{"intent":"deny"},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"},"websearch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-parse-hermes.json b/.sisyphus/evidence/task-5-parse-hermes.json
new file mode 100644
index 0000000..d94f512
--- /dev/null
+++ b/.sisyphus/evidence/task-5-parse-hermes.json
@@ -0,0 +1 @@
+{"description":"Work communication specialist. Handles Basecamp tasks, Outlook email, and MS Teams meetings","display_name":"Hermes (Communication)","mode":"subagent","name":"hermes","permissions":{"bash":{"intent":"ask","rules":["cat *:allow","echo *:allow"]},"edit":{"intent":"allow","rules":["/run/agenix/**:deny"]},"external_directory":{"intent":"ask","rules":["~/p/**:allow","~/.config/opencode/**:allow","/tmp/**:allow","/run/agenix/**:allow"]},"question":{"intent":"allow"},"webfetch":{"intent":"allow"}}}
diff --git a/.sisyphus/evidence/task-5-prompt-diffs.txt b/.sisyphus/evidence/task-5-prompt-diffs.txt
new file mode 100644
index 0000000..e84fcbc
--- /dev/null
+++ b/.sisyphus/evidence/task-5-prompt-diffs.txt
@@ -0,0 +1,6 @@
+diff chiron: exit 0
+diff chiron-forge: exit 0
+diff hermes: exit 0
+diff athena: exit 0
+diff apollo: exit 0
+diff calliope: exit 0
diff --git a/.sisyphus/evidence/task-7-lib-agents.json b/.sisyphus/evidence/task-7-lib-agents.json
new file mode 100644
index 0000000..35e25c6
--- /dev/null
+++ b/.sisyphus/evidence/task-7-lib-agents.json
@@ -0,0 +1,39 @@
+{
+ "task": "task-7-lib-agents",
+ "status": "complete",
+ "timestamp": "2026-04-10",
+ "files": {
+ "created": [
+ "/home/m3tam3re/p/NIX/nixpkgs/lib/agents.nix"
+ ],
+ "modified": [
+ "/home/m3tam3re/p/NIX/nixpkgs/lib/default.nix"
+ ]
+ },
+ "checks": {
+ "alejandra_check": {
+ "command": "alejandra --check lib/agents.nix lib/default.nix",
+ "result": "PASS",
+ "output": "Congratulations! Your code complies with the Alejandra style."
+ },
+ "nix_flake_check": {
+ "command": "nix flake check",
+ "result": "PASS",
+ "exit_code": 0,
+ "notable": "21 flake checks ran, all derivations evaluated successfully"
+ }
+ },
+ "lib_agents_functions": {
+ "loadCanonical": "Takes { agentsInput } and returns agentsInput.lib.loadAgents",
+ "renderForOpencode": "Stub: pkgs.runCommand 'opencode-agents' {} 'echo stub > $out'",
+ "renderForClaudeCode": "Stub: pkgs.runCommand 'claude-code-agents' {} 'echo stub > $out'",
+ "renderForPi": "Stub: pkgs.runCommand 'pi-agents' {} 'echo stub > $out'",
+ "renderForTool": "Dispatcher by tool string: opencode | claude-code | pi"
+ },
+ "notes": [
+ "lib/agents.nix already existed with correct structure when task started",
+ "lib/default.nix already had the agents entry wired in",
+ "Both files passed alejandra --check without modification needed",
+ "nix flake check passed with EXIT: 0"
+ ]
+}
diff --git a/.sisyphus/notepads/harness-agnostic-migration/decisions.md b/.sisyphus/notepads/harness-agnostic-migration/decisions.md
new file mode 100644
index 0000000..e69de29
diff --git a/.sisyphus/notepads/harness-agnostic-migration/issues.md b/.sisyphus/notepads/harness-agnostic-migration/issues.md
new file mode 100644
index 0000000..4a34b80
--- /dev/null
+++ b/.sisyphus/notepads/harness-agnostic-migration/issues.md
@@ -0,0 +1,12 @@
+
+## [2026-04-10] CRITICAL: Subagent Scope Creep - Skills Deleted
+- Tasks 1 & 2 subagent DELETED skills from disk (basecamp, brainstorming, frontend-design, kestra-flow, kestra-ops, obsidian, prompt-engineering-patterns, systematic-debugging, xlsx)
+- These were NOT in scope and MUST NOT be touched per the plan
+- Skills were restored via: `git checkout HEAD -- skills/`
+- ROOT CAUSE: Subagents may try to "clean up" untracked/modified files when working in the repo
+- MITIGATION: All future delegation prompts must explicitly state "DO NOT touch skills/ directory or any existing files"
+
+## [2026-04-10] NOTE: nix eval requires --impure for builtins.readFile with absolute paths
+- Task 2 spike required `nix eval --impure --expr 'builtins.fromTOML (builtins.readFile )'`
+- This is expected for absolute filesystem paths outside the flake
+- For flake-based rendering (nixpkgs lib), this is not an issue as files go through `pkgs.writeText` or are read at flake evaluation time via `inputs`
diff --git a/.sisyphus/notepads/harness-agnostic-migration/learnings.md b/.sisyphus/notepads/harness-agnostic-migration/learnings.md
new file mode 100644
index 0000000..7e94f6b
--- /dev/null
+++ b/.sisyphus/notepads/harness-agnostic-migration/learnings.md
@@ -0,0 +1,251 @@
+# Learnings
+
+## [2026-04-10] Session Initialized
+- Plan: harness-agnostic-migration (21 tasks + 4 final)
+- AGENTS repo: /home/m3tam3re/p/AI/AGENTS
+- nixpkgs repo: /home/m3tam3re/p/NIX/nixpkgs
+- TOML chosen as canonical format (builtins.fromTOML, no IFD)
+- Renderers belong in nixpkgs, not AGENTS repo
+- 6 agents: chiron, chiron-forge, hermes, athena, apollo, calliope
+- OpenCode: file-based agents (.opencode/agent/*.md) NOT config.json embedding
+- Pi: no subagents — renders AGENTS.md + SYSTEM.md only
+- Claude Code: name must be [a-z0-9-]+ (slugified)
+- No model in agent.toml (per-machine via home-manager)
+- No MCP in agent.toml (tool-specific infrastructure)
+- No YAML files as canonical source
+- Permission model: two-level — intent (allow/deny/ask) + rules array "pattern:action"
+- mkOpencodeRules → mkCodingRules (backward-compat alias)
+- lib.mkOpencodeSkills stays unchanged
+## [2026-04-10] Task 1: Capture Golden File Baseline
+
+### Golden File Created
+- **Path**: `.sisyphus/evidence/agents-golden.json`
+- **Method**: `jq --sort-keys . agents/agents.json`
+- **Status**: ✓ Valid JSON, parseable, verified
+
+### Agent Count
+- **Total**: 6 agents
+- **Verification**: `jq 'keys | length'` → 6 ✓
+
+### Agent Names (Alphabetically Sorted)
+1. Apollo (Knowledge Management) — subagent, private knowledge specialist
+2. Athena (Researcher) — subagent, work knowledge specialist
+3. Calliope (Writer) — subagent, writing specialist
+4. Chiron (Assistant) — primary agent, plan mode
+5. Chiron Forge (Builder) — primary agent, build mode
+6. Hermes (Communication) — subagent, communication specialist
+
+### Agent Object Structure
+Every agent has 5 top-level keys:
+- `description` (string) — agent purpose and capabilities
+- `mode` (string) — "primary" or "subagent"
+- `model` (string) — LLM model ID (all use "zai-coding-plan/glm-5")
+- `prompt` (string) — reference to prompt file via `{file:./prompts/...}`
+- `permission` (object) — capability matrix with granular controls
+
+### Permission Structure
+All agents have 6 permission categories:
+- `question` → "allow" | "deny" | "ask"
+- `webfetch` → "allow" | "deny" | "ask"
+- `websearch` → "allow" | "deny" | "ask" (not all agents)
+- `edit` → nested rules (allow/deny per path pattern)
+- `bash` → nested rules (allow/deny per command pattern)
+- `external_directory` → nested rules (allow/deny per path pattern)
+
+### Baseline Purpose
+This golden file serves as the **canonical reference** for backward-compat verification in Task 8.
+It will be compared against output from the harness-agnostic bridge to ensure config integrity.
+
+### Next Steps
+- Task 8 will generate a comparable JSON from the bridge
+- Diff will be computed: `jq --sort-keys . bridge_output.json > bridge-output.json && diff agents-golden.json bridge-output.json`
+- Any structural or content changes will be flagged
+
+## [2026-04-10] Task 2: TOML Feasibility Spike
+
+**Result: ✅ PASS**
+
+### Test Execution
+- Full Chiron-Forge TOML (16 lines, 5 permission sections, 15 bash rules, 4 external_directory rules): **PARSED SUCCESSFULLY**
+- Minimal TOML (2 lines, name + description only): **PARSED SUCCESSFULLY**
+- Parser: `nix eval --impure --expr 'builtins.fromTOML (builtins.readFile )' --json`
+
+### Glob Patterns Verified
+All complex patterns preserved exactly:
+- `rm -rf *` → intact (wildcard in rule)
+- `git reset --hard*` → intact (pattern suffix)
+- `git push*` → intact (pattern suffix)
+- `git push --force*` → intact (flag + pattern)
+- `git push -f *` → intact (short flag + wildcard)
+- `~/p/**` → intact (recursive glob)
+- `~/.config/opencode/**` → intact (home + recursive)
+- `/run/agenix/**` → intact (absolute + recursive)
+- `/tmp/**` → intact (absolute + recursive)
+
+### Special Handling
+- TOML arrays of strings work perfectly for `rules` list
+- Two-level structure (`intent` + `rules`) maps cleanly from JSON nested objects
+- No datetime fields used (confirmed limitation is not a blocker for permissions schema)
+- No multi-line inline tables needed (flat key-value structure only)
+
+### Conclusion
+**✅ TOML is suitable for agent permission config.** The proposed two-level model (`intent = "allow"|"deny"|"ask"` + `rules = [...]` array) is:
+- **Parseable**: `builtins.fromTOML` handles it perfectly with `--impure` flag
+- **Pattern-safe**: All glob patterns (wildcards, recursion, flags) preserved exactly
+- **Backward-compatible**: Maps cleanly from existing JSON nested object format
+
+### Evidence Files
+- `/home/m3tam3re/p/AI/AGENTS/.sisyphus/evidence/task-2-toml-spike.json` (full Chiron-Forge parsed result)
+- `/home/m3tam3re/p/AI/AGENTS/.sisyphus/evidence/task-2-toml-minimal.json` (minimal test parsed result)
+
+### Next Steps
+No workarounds needed. Ready to implement full harness with TOML permission loader.
+
+## [2026-04-10] Task 3: Canonical Schema Designed
+- SCHEMA.md created at agents/SCHEMA.md
+- Required fields: name, description
+- Optional: display_name, mode, tags, max_turns, skills, context, rules
+- Permissions: [permissions.TOOL] with intent + rules[]
+- Supported tools: bash, edit, webfetch, websearch, question, external_directory
+- Per-renderer matrix: documented
+- Sample TOML parses: YES
+- Evidence: .sisyphus/evidence/task-3-schema-sample.toml (TOML source)
+- Evidence: .sisyphus/evidence/task-3-schema-sample-parsed.json (Nix parse result)
+
+## [2026-04-10] Task 4: OpenCode File-Based Agent Format
+
+### File Location
+- **Per-project**: `.opencode/agents/`
+- **Global**: `~/.config/opencode/agents/`
+- Per-project agents override global agents with same name
+
+### Agent Naming
+- **Filename determines agent name** — no `name` field in frontmatter
+- Example: `review.md` → agent named `review`
+- Naming convention: `[a-z0-9-]+` (lowercase, hyphens)
+
+### YAML Frontmatter Structure
+- **Required**: `description` (string)
+- **Optional**: `mode` (`primary`|`subagent`|`all`), `model`, `temperature`, `top_p`, `steps`, `disable`, `hidden`, `color`, `permission`, `task`
+- Provider-specific fields pass through to LLM (e.g., `reasoningEffort` for OpenAI)
+
+### Permission Format in Markdown
+```yaml
+permission:
+ edit:
+ "*": allow
+ "/sensitive/**": deny
+ bash:
+ "*": ask
+ "git push": deny
+ "git log*": allow
+ webfetch: allow
+ question: allow
+ websearch: allow
+ external_directory:
+ "*": ask
+ "~/p/**": allow
+```
+- Actions: `allow` | `ask` | `deny`
+- Nested rules support glob patterns (`*`, `**`, wildcards)
+- Last matching rule wins
+
+### Mode Field Values
+- `primary` — available via Tab switching
+- `subagent` — invoked via @mention or by other agents
+- `all` — flexible, can be used both ways
+
+### System Prompt Delivery
+- Markdown body (after frontmatter) IS the system prompt
+- No `{file:...}` syntax in markdown (unlike JSON config)
+- Direct markdown content → sent to LLM
+
+### Default Behaviors
+- `mode` → `all` (if omitted)
+- `model` → global config (primary agents) or parent's model (subagents)
+- `temperature` → model-specific default (0 for most, 0.55 for Qwen)
+- `permission` → full access (if omitted, all tools enabled)
+
+### Interaction with config.json
+- **Both** JSON and markdown agents are loaded
+- Markdown agents **override** JSON agents with same name
+- No conflict; complementary
+
+### KEY ADVANTAGE: Prompt Changes Don't Require home-manager switch
+- File changes → OpenCode reloads on next startup
+- NO home-manager switch needed
+- This is the primary motivation for file-based migration
+
+### Limitations
+- **No subdirectories**: only root level of `.opencode/agents/` scanned
+- **No name field**: filename is authoritative
+- **Filename must be valid**: [a-z0-9-]+ convention
+
+### Evidence File
+- `/home/m3tam3re/p/AI/AGENTS/.sisyphus/evidence/task-4-opencode-agent-format.md`
+- Complete spec with examples, frontmatter reference, permission format, YAML/JSON comparison
+
+### Confirmed Answers
+- Directory: `agents/` (both global and per-project) ✅
+- File naming: Filename determines agent name ✅
+- Required fields: `description` only ✅
+- Permission format: Nested objects like JSON ✅
+- Mode values: `primary` | `subagent` | `all` ✅
+- System prompt: Markdown body after frontmatter ✅
+- Requires HM switch for prompt changes: **NO** ✅
+- Frontmatter needs `name` field: **NO** ✅
+
+### Sources
+- https://opencode.ai/docs/agents (official documentation)
+- /home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/coding/opencode.nix (current deployment)
+- /home/m3tam3re/p/AI/AGENTS/agents/agents.json (current 6 agents)
+- /home/m3tam3re/p/AI/AGENTS/AGENTS.md (repo documentation)
+
+
+## [2026-04-10] Task 4: Key Finding — OpenCode Permission Rule Precedence
+- OpenCode uses LAST-MATCHING-RULE-WINS (not first-match!)
+- This matters for renderer: when translating `rules[]` array, order must be preserved
+- The wildcard `"*"` rule becomes the fallback (keep it first in YAML output, others after)
+- OpenCode directory is `.opencode/agents/` (PLURAL), not `.opencode/agent/`
+- Global agents: `~/.config/opencode/agents/` (PLURAL too)
+- `description` is the only REQUIRED frontmatter field
+- Agent name is derived from filename (no `name` field in frontmatter)
+- Supported tools: edit, bash, webfetch, question, websearch, external_directory, task
+- `task` permission controls which subagents can be invoked (glob patterns)
+
+## [2026-04-10] Task 4: OpenCode Permission YAML Format
+The granular format is nested YAML objects, NOT a rule array:
+```yaml
+permission:
+ bash:
+ "*": ask # This is the intent/default
+ "git status*": allow # These are the rules
+ "git push*": deny
+```
+The renderer must convert from canonical `intent + rules[]` format to this nested YAML format.
+The `"*"` key always goes FIRST (as the fallback), then specific rules after it.
+
+## [2026-04-10] Task 5: All 6 agent.toml Files Created
+- Directories: agents/{chiron,chiron-forge,hermes,athena,apollo,calliope}/
+- Each has: agent.toml + system-prompt.md
+- All TOML parse: YES (6/6 verified via `nix eval --impure`)
+- Prompt diffs: all zero (6/6 byte-identical)
+- Chiron mode: primary
+- Chiron-Forge mode: primary
+- Other 4 mode: subagent
+- Commit: 7a8dd52 (12 files, 543 insertions)
+- Permission translation notes:
+ - JSON `"*"` key → TOML `intent` field (straightforward)
+ - JSON non-`"*"` keys → TOML `rules` array as `"pattern:action"` strings
+ - Simple string permissions (e.g., `"question": "allow"`) → `intent` only, no rules array
+ - Description trailing periods stripped per SCHEMA.md constraint ("no trailing period")
+ - `td *` and `bd *` bash rules in chiron preserved (custom tool aliases)
+ - No model field, no prompt field per schema exclusion rules
+
+## [2026-04-10] Task 6: loadAgents + agentsJson Bridge Complete
+- Fix applied: description = agent.description + "." (SCHEMA.md has no trailing period; golden file does)
+- All 6 agents load correctly via lib.loadAgents
+- agentsJson bridge matches golden file exactly (zero diff)
+- nix flake check: PASS
+- alejandra formatting: PASS
+- Commit: a81e178 feat: export loadAgents and backward-compat agentsJson from flake
diff --git a/.sisyphus/notepads/harness-agnostic-migration/problems.md b/.sisyphus/notepads/harness-agnostic-migration/problems.md
new file mode 100644
index 0000000..e69de29
diff --git a/.sisyphus/plans/harness-agnostic-migration.md b/.sisyphus/plans/harness-agnostic-migration.md
new file mode 100644
index 0000000..10f30ff
--- /dev/null
+++ b/.sisyphus/plans/harness-agnostic-migration.md
@@ -0,0 +1,1679 @@
+# Harness-Agnostic Agent Migration
+
+## TL;DR
+
+> **Quick Summary**: Migrate AGENTS repo from OpenCode-specific agents.json to a tool-agnostic canonical format (agent.toml + system-prompt.md per agent). Build Nix rendering pipeline in m3ta-nixpkgs that generates tool-specific configs for OpenCode, Claude Code, and Pi. Support system-level (home-manager) and project-level (flake.nix + direnv).
+>
+> **Deliverables**:
+> - 6 canonical agent definitions in AGENTS repo (TOML + Markdown)
+> - 3 tool renderers in m3ta-nixpkgs (OpenCode, Claude Code, Pi)
+> - Home-manager modules per tool replacing current opencode.nix
+> - Project-level lib functions for flake.nix + direnv usage
+> - Backward-compatible bridge during migration
+>
+> **Estimated Effort**: Large
+> **Parallel Execution**: YES — 4 waves
+> **Critical Path**: TOML spike → canonical agents → lib/agents.nix → per-tool HM modules → golden file verification
+
+---
+
+## Context
+
+### Original Request
+Restructure AGENTS repo to be harness-agnostic so the same agent definitions, skills, prompts work across OpenCode, Claude Code, Codex, Pi, and future coding agents. Build corresponding Nix infrastructure in m3ta-nixpkgs for system-level and project-level consumption.
+
+### Interview Summary
+**Key Discussions**:
+- YAML rejected for canonical format — TOML chosen (native `builtins.fromTOML`, no IFD)
+- Renderers belong in m3ta-nixpkgs, not AGENTS repo (AGENTS stays pure data)
+- OpenCode + Claude Code + Pi renderers now; Codex/Aider later on demand
+- Two-level permission model: simple intent + optional rules array for glob patterns
+- mkOpencodeRules renamed to mkCodingRules (backward-compat alias)
+- All 6 agents migrated to canonical TOML format
+- opencode.nix replaced by new per-tool modules (but non-agent OpenCode config kept separate)
+- Verification: nix flake check + rendered OpenCode output must match golden file
+- Project-level: lib functions returning derivations, usable via shellHook in devShells
+
+**Research Findings**:
+- **OpenCode**: Now supports file-based agents (`.opencode/agent/*.md` with YAML frontmatter) — modern path, avoids config.json embedding
+- **Claude Code**: Subagents require `name` (kebab-case) + `description` as mandatory frontmatter fields
+- **Pi**: No subagent concept. Uses AGENTS.md/CLAUDE.md for instructions, SYSTEM.md for prompt override, same SKILL.md format as OpenCode
+- **Codex**: config.toml + AGENTS.md only, no agent definitions — single-agent tool
+- **Aider**: .aider.conf.yml + read: lists, no agents/permissions/skills
+- **TOML in Nix**: `builtins.fromTOML` supports TOML 1.0.0 strict. No datetime fields, no multi-line inline tables.
+
+### Metis Review
+**Identified Gaps** (addressed):
+- **oh-my-opencode.json ownership**: Non-agent OpenCode config stays in slimmed opencode.nix (not in agents.nix)
+- **Pi has no subagents**: Pi renderer produces AGENTS.md + SYSTEM.md from primary agent only. Subagents skipped.
+- **Claude Code name format**: Renderer must slugify to `[a-z0-9-]+`
+- **Model string formats differ**: Need mapping table (canonical → tool-specific)
+- **OpenCode file-based agents**: Modern path via `.opencode/agent/*.md` preferred over config.json embedding
+- **TOML feasibility risk**: Must test Chiron-Forge's 15+ bash glob patterns FIRST
+- **Phase boundary enforced**: agents only (no skills/rules/MCP migration in this plan)
+- **Backward-compat bridge**: `lib.agentsJson` in AGENTS repo produces old JSON during transition
+- **Partial migration hazard**: Version check in nixpkgs to handle old AGENTS input gracefully
+
+---
+
+## Work Objectives
+
+### Core Objective
+Transform the AGENTS repository into a tool-agnostic data repository and build a Nix rendering pipeline that generates tool-specific configurations for multiple coding agents.
+
+### Concrete Deliverables
+- `AGENTS/agents/{chiron,chiron-forge,hermes,athena,apollo,calliope}/agent.toml` — 6 canonical agent definitions
+- `AGENTS/agents/{name}/system-prompt.md` — 6 system prompts (byte-identical to current .txt files)
+- `AGENTS/flake.nix` — Updated with `lib.loadAgents` and backward-compat `lib.agentsJson`
+- `nixpkgs/lib/agents.nix` — `loadCanonical` + 3 renderer functions
+- `nixpkgs/modules/home-manager/coding/agents/opencode.nix` — OpenCode HM sub-module
+- `nixpkgs/modules/home-manager/coding/agents/claude-code.nix` — Claude Code HM sub-module
+- `nixpkgs/modules/home-manager/coding/agents/pi.nix` — Pi HM sub-module
+- `nixpkgs/modules/home-manager/coding/opencode.nix` — Slimmed (non-agent config only)
+- `nixpkgs/lib/coding-rules.nix` — Renamed from opencode-rules.nix with backward-compat alias
+
+### Definition of Done
+- [ ] `nix flake check` passes on both repos
+- [ ] Rendered OpenCode agent output is semantically equivalent to current agents.json (golden file diff = 0)
+- [ ] All 6 agents parse successfully via `builtins.fromTOML`
+- [ ] Claude Code renderer produces valid MD files with required frontmatter
+- [ ] Pi renderer produces valid AGENTS.md + optional settings.json
+- [ ] System prompt content is byte-identical to current .txt files
+- [ ] `nix fmt` (alejandra) produces no changes
+- [ ] `lib.mkOpencodeSkills` still works unchanged
+
+### Must Have
+- All 6 agents in canonical TOML format with system-prompt.md
+- OpenCode renderer producing `.opencode/agent/*.md` file-based agents
+- Claude Code renderer producing `.claude/agents/*.md` with valid YAML frontmatter
+- Pi renderer producing AGENTS.md + SYSTEM.md from primary agent
+- Per-machine model overrides via home-manager
+- Backward-compatible bridge (`lib.agentsJson`) during transition
+- Project-level `renderForTool` lib function for flake.nix + direnv
+
+### Must NOT Have (Guardrails)
+- No YAML files as canonical source (TOML only — no IFD)
+- No renderer code in AGENTS repo (renderers live in nixpkgs)
+- No Codex or Aider renderers (design for extensibility, implement only 3)
+- No MCP configuration in agent.toml (MCP is tool-specific infrastructure)
+- No prompt content changes during migration (byte-identical rename only)
+- No skills/rules/context migration in this plan (separate concern)
+- No `mkOpencodeSkills` changes (stays as-is)
+- No datetime fields in TOML schema (requires experimental Nix flag)
+- No multi-line inline tables in TOML (not supported by Nix's TOML 1.0.0)
+- No generic permission translation DSL (each renderer hard-codes its own mapping)
+- No monolithic home-manager module (separate sub-module per tool)
+
+---
+
+## Verification Strategy (MANDATORY)
+
+> **ZERO HUMAN INTERVENTION** — ALL verification is agent-executed. No exceptions.
+
+### Test Decision
+- **Infrastructure exists**: YES — Nix evaluation + alejandra formatter
+- **Automated tests**: Nix eval comparison (golden file diff)
+- **Framework**: `nix eval`, `jq --sort-keys`, `diff`, `python3` for YAML validation
+
+### QA Policy
+Every task MUST include agent-executed QA scenarios.
+Evidence saved to `.sisyphus/evidence/task-{N}-{scenario-slug}.{ext}`.
+
+- **Nix evaluation**: Use Bash (nix eval) — Evaluate expressions, compare outputs
+- **File validation**: Use Bash (python3/jq) — Parse YAML frontmatter, validate JSON
+- **Content comparison**: Use Bash (diff) — Byte-identical prompt verification
+- **Formatting**: Use Bash (alejandra --check) — No formatting drift
+
+---
+
+## Execution Strategy
+
+### Parallel Execution Waves
+
+```
+Wave 1 (Start Immediately — foundation + spike):
+├── Task 1: Capture golden file baseline [quick]
+├── Task 2: TOML feasibility spike with Chiron-Forge [quick]
+├── Task 3: Design canonical agent.toml schema [deep]
+└── Task 4: Research OpenCode file-based agent frontmatter [quick]
+
+Wave 2 (After Wave 1 — AGENTS repo migration):
+├── Task 5: Create all 6 agent.toml + system-prompt.md files [unspecified-high]
+├── Task 6: Update AGENTS flake.nix with loadAgents + agentsJson [deep]
+├── Task 7: Create lib/agents.nix in nixpkgs with loadCanonical [deep]
+└── Task 8: Verify backward-compat bridge produces golden file match [quick]
+
+Wave 3 (After Wave 2 — renderers + HM modules, MAX PARALLEL):
+├── Task 9: Implement OpenCode renderer in lib/agents.nix [deep]
+├── Task 10: Implement Claude Code renderer in lib/agents.nix [deep]
+├── Task 11: Implement Pi renderer in lib/agents.nix [unspecified-high]
+├── Task 12: Create HM sub-module for OpenCode (agents/opencode.nix) [unspecified-high]
+├── Task 13: Create HM sub-module for Claude Code (agents/claude-code.nix) [unspecified-high]
+├── Task 14: Create HM sub-module for Pi (agents/pi.nix) [unspecified-high]
+├── Task 15: Slim down existing opencode.nix to non-agent config only [quick]
+└── Task 16: Rename mkOpencodeRules to mkCodingRules + backward-compat alias [quick]
+
+Wave 4 (After Wave 3 — integration + project-level + cleanup):
+├── Task 17: Add project-level renderForTool lib function [deep]
+├── Task 18: Update nixpkgs flake.nix exports + aggregator imports [quick]
+├── Task 19: Update AGENTS.md documentation [quick]
+├── Task 20: Remove legacy agents.json + prompts/*.txt from AGENTS repo [quick]
+└── Task 21: End-to-end integration test across both repos [unspecified-high]
+
+Wave FINAL (After ALL tasks — 4 parallel reviews, then user okay):
+├── Task F1: Plan compliance audit (oracle)
+├── Task F2: Code quality review (unspecified-high)
+├── Task F3: Real manual QA (unspecified-high)
+└── Task F4: Scope fidelity check (deep)
+-> Present results -> Get explicit user okay
+```
+
+### Dependency Matrix
+
+| Task | Depends On | Blocks | Wave |
+|------|-----------|--------|------|
+| 1 | — | 8, 21 | 1 |
+| 2 | — | 3, 5 | 1 |
+| 3 | 2 | 5, 6, 7 | 1 |
+| 4 | — | 9, 12 | 1 |
+| 5 | 2, 3 | 6, 8, 9, 10, 11 | 2 |
+| 6 | 3, 5 | 8, 17 | 2 |
+| 7 | 3 | 9, 10, 11, 12, 13, 14, 17 | 2 |
+| 8 | 1, 5, 6 | 20 | 2 |
+| 9 | 4, 5, 7 | 12 | 3 |
+| 10 | 5, 7 | 13 | 3 |
+| 11 | 5, 7 | 14 | 3 |
+| 12 | 9 | 18, 21 | 3 |
+| 13 | 10 | 18, 21 | 3 |
+| 14 | 11 | 18, 21 | 3 |
+| 15 | — | 18 | 3 |
+| 16 | — | 18 | 3 |
+| 17 | 6, 7 | 21 | 4 |
+| 18 | 12, 13, 14, 15, 16 | 21 | 4 |
+| 19 | 5 | — | 4 |
+| 20 | 8 | — | 4 |
+| 21 | 1, 12, 13, 14, 17, 18 | F1-F4 | 4 |
+
+### Agent Dispatch Summary
+
+- **Wave 1**: **4** — T1 → `quick`, T2 → `quick`, T3 → `deep`, T4 → `quick`
+- **Wave 2**: **4** — T5 → `unspecified-high`, T6 → `deep`, T7 → `deep`, T8 → `quick`
+- **Wave 3**: **8** — T9 → `deep`, T10 → `deep`, T11 → `unspecified-high`, T12-T14 → `unspecified-high`, T15-T16 → `quick`
+- **Wave 4**: **5** — T17 → `deep`, T18 → `quick`, T19 → `quick`, T20 → `quick`, T21 → `unspecified-high`
+- **FINAL**: **4** — F1 → `oracle`, F2 → `unspecified-high`, F3 → `unspecified-high`, F4 → `deep`
+
+---
+
+## TODOs
+
+- [x] 1. Capture Golden File Baseline
+
+ **What to do**:
+ - On the machine where home-manager is configured, capture the current rendered OpenCode agent config:
+ ```bash
+ nix eval --json '.#homeConfigurations.sk.config.programs.opencode.settings.agent' | jq --sort-keys . > /tmp/agents-golden.json
+ ```
+ - Also capture the raw agents.json for direct comparison:
+ ```bash
+ jq --sort-keys . /home/m3tam3re/p/AI/AGENTS/agents/agents.json > /tmp/agents-json-golden.json
+ ```
+ - Store both golden files in `.sisyphus/evidence/` for later use by other tasks
+ - Note: If home-manager eval isn't available, use direct file comparison as fallback
+
+ **Must NOT do**:
+ - Modify any source files
+ - Change agents.json content
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 1 (with Tasks 2, 3, 4)
+ - **Blocks**: Tasks 8, 21
+ - **Blocked By**: None
+
+ **References**:
+ - `agents/agents.json` — Current source of truth (173 lines, 6 agents)
+ - `modules/home-manager/coding/opencode.nix:148-149` in nixpkgs — Where agents.json gets embedded via `builtins.fromJSON (builtins.readFile ...)`
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Golden file captured and parseable
+ Tool: Bash
+ Preconditions: AGENTS repo at /home/m3tam3re/p/AI/AGENTS
+ Steps:
+ 1. Run: jq --sort-keys . /home/m3tam3re/p/AI/AGENTS/agents/agents.json > .sisyphus/evidence/agents-golden.json
+ 2. Run: jq 'keys | length' .sisyphus/evidence/agents-golden.json
+ 3. Assert output is exactly "6" (6 agents)
+ 4. Run: jq 'keys' .sisyphus/evidence/agents-golden.json
+ 5. Assert output contains "Chiron (Assistant)", "Chiron Forge (Builder)", "Hermes (Communication)", "Athena (Researcher)", "Apollo (Knowledge Management)", "Calliope (Writer)"
+ Expected Result: Golden file exists, contains 6 agents, valid JSON
+ Failure Indicators: jq parse error, agent count != 6, missing agent names
+ Evidence: .sisyphus/evidence/agents-golden.json
+ ```
+
+ **Commit**: NO (evidence only, no source changes)
+
+---
+
+- [x] 2. TOML Feasibility Spike — Chiron-Forge Permission Matrix
+
+ **What to do**:
+ - Write a test `agent.toml` for Chiron-Forge (the most complex agent — 2 primary modes, 15+ bash permission patterns with globs, wildcards, and special characters)
+ - Test it parses correctly with `nix eval --expr 'builtins.fromTOML (builtins.readFile ./test.toml)'`
+ - Specifically verify these tricky patterns parse in TOML strings:
+ - `"rm -rf *"` (glob with spaces)
+ - `"git reset --hard*"` (double-dash + glob)
+ - `"git push --force*"` (double-dash + glob)
+ - `"git push -f *"` (short flag + glob)
+ - `"~/p/**"` (home dir + double glob)
+ - `"/run/agenix/**"` (absolute path + double glob)
+ - Test the two-level permission schema: simple intent + rules array
+ - Write the test file to a temporary location, NOT in agents/ yet
+ - If parsing FAILS: document exactly what fails and propose schema workaround
+
+ **Must NOT do**:
+ - Create permanent files in agents/ directory (this is a spike)
+ - Modify flake.nix
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 1 (with Tasks 1, 3, 4)
+ - **Blocks**: Tasks 3, 5
+ - **Blocked By**: None
+
+ **References**:
+ - `agents/agents.json:40-68` — Chiron Forge's full permission matrix (the most complex agent)
+ - `agents/agents.json:1-38` — Chiron's permission matrix (read-only agent with extensive bash allowlist)
+ - Nix TOML docs: `builtins.fromTOML` supports TOML 1.0.0 strict (toml11 v4). No datetime, no multi-line inline tables.
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: TOML parses all permission patterns correctly
+ Tool: Bash
+ Preconditions: Nix available with builtins.fromTOML
+ Steps:
+ 1. Write test agent.toml with Chiron-Forge's full permission set to /tmp/test-agent.toml
+ 2. Run: nix eval --expr 'builtins.fromTOML (builtins.readFile /tmp/test-agent.toml)' --json
+ 3. Pipe output to jq and verify:
+ - .name == "chiron-forge"
+ - .permissions.bash.intent == "allow"
+ - .permissions.bash.rules | length >= 4 (deny rules)
+ - .permissions.edit.intent == "allow"
+ - .permissions.external_directory.rules | length >= 4
+ 4. Verify each deny pattern string is preserved exactly (no escaping issues)
+ Expected Result: All fields parse, all glob patterns preserved, all special characters intact
+ Failure Indicators: Nix eval error, missing fields, mangled glob patterns, escape issues
+ Evidence: .sisyphus/evidence/task-2-toml-spike.json
+
+ Scenario: TOML handles edge cases (empty rules, minimal agent)
+ Tool: Bash
+ Preconditions: Nix available
+ Steps:
+ 1. Write minimal agent.toml with only name + description to /tmp/test-minimal.toml
+ 2. Run: nix eval --expr 'builtins.fromTOML (builtins.readFile /tmp/test-minimal.toml)' --json
+ 3. Assert parse succeeds with only required fields
+ Expected Result: Minimal TOML parses without error
+ Failure Indicators: Nix eval error on missing optional fields
+ Evidence: .sisyphus/evidence/task-2-toml-minimal.json
+ ```
+
+ **Commit**: NO (spike only, temporary files)
+
+---
+
+- [x] 3. Design Canonical agent.toml Schema
+
+ **What to do**:
+ - Based on TOML spike results (Task 2) and research findings, define the final canonical schema
+ - Create `agents/SCHEMA.md` documenting the canonical format with:
+ - All required fields: `name` (string, kebab-case), `description` (string)
+ - All optional fields: `mode`, `tags`, `max_turns`
+ - Permission schema: `[permissions.TOOL]` tables with `intent` (allow/deny/ask) + `rules` (array of "pattern:action" strings)
+ - Skill references: `skills` array of skill names
+ - Context references: `context` array of file paths
+ - Rule references: `rules` array of rule paths (e.g. "languages/nix")
+ - NO `model` field (model is per-machine via home-manager)
+ - NO `prompt` field (prompt lives in system-prompt.md, not in TOML)
+ - NO MCP configuration (tool-specific)
+ - NO datetime fields (Nix limitation)
+ - Schema must be a SUPERSET: renderers silently drop fields they can't map
+ - Document per-renderer field support matrix in SCHEMA.md
+
+ **Must NOT do**:
+ - Include model configuration (per-machine concern)
+ - Include MCP server config (tool-specific infrastructure)
+ - Include hooks (Claude Code exclusive, not canonical)
+ - Use datetime TOML types
+ - Use multi-line inline tables
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (but should incorporate Task 2 results if available)
+ - **Parallel Group**: Wave 1 (with Tasks 1, 2, 4)
+ - **Blocks**: Tasks 5, 6, 7
+ - **Blocked By**: Task 2 (TOML feasibility must pass first)
+
+ **References**:
+ - Task 2's TOML spike results — Confirms which TOML patterns work
+ - `agents/agents.json` — Current field set to preserve (all 6 agents)
+ - Claude Code sub-agents docs — Required frontmatter fields: `name` (kebab-case), `description`
+ - OpenCode agent schema — Supports: name, description, mode, model, temperature, top_p, steps, permission[], color, hidden, disable
+ - Pi README — No agent schema. Uses AGENTS.md + SYSTEM.md + settings.json
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Schema document is complete and internally consistent
+ Tool: Bash
+ Preconditions: agents/SCHEMA.md created
+ Steps:
+ 1. Read agents/SCHEMA.md
+ 2. Verify it documents: required fields, optional fields, permission schema, skill references, context references
+ 3. Verify it explicitly lists: fields NOT included (model, prompt, mcp, hooks, datetime)
+ 4. Verify it includes a per-renderer support matrix table
+ 5. Write a sample agent.toml following the schema and parse it with builtins.fromTOML
+ Expected Result: Schema is complete, sample TOML parses successfully
+ Failure Indicators: Missing field documentation, sample TOML fails to parse
+ Evidence: .sisyphus/evidence/task-3-schema-sample.toml
+ ```
+
+ **Commit**: YES
+ - Message: `docs: add canonical agent.toml schema definition`
+ - Files: `agents/SCHEMA.md`
+ - Pre-commit: `nix eval --expr 'builtins.fromTOML (builtins.readFile ./evidence-sample.toml)' --json`
+
+---
+
+- [x] 4. Research OpenCode File-Based Agent Frontmatter
+
+ **What to do**:
+ - Verify OpenCode's `.opencode/agent/*.md` file-based agent format by reading source code or docs
+ - Document the exact YAML frontmatter fields supported:
+ - Which fields map from canonical agent.toml?
+ - What is the permission format in frontmatter?
+ - How does `mode: primary | subagent | all` work?
+ - What is the default behavior for omitted fields?
+ - How does file-based agent discovery interact with config.json `agent` key?
+ - Confirm that file-based agents DON'T require `home-manager switch` for prompt changes (key advantage over config.json embedding)
+ - Save findings to `.sisyphus/evidence/task-4-opencode-agent-format.md`
+
+ **Must NOT do**:
+ - Modify any files
+ - Create agent files yet (that's Task 5)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES
+ - **Parallel Group**: Wave 1 (with Tasks 1, 2, 3)
+ - **Blocks**: Tasks 9, 12
+ - **Blocked By**: None
+
+ **References**:
+ - OpenCode GitHub: `github.com/sst/opencode` (or `anomalyco/opencode`) — search for agent loading logic
+ - OpenCode docs on file-based agents: `.opencode/agent/*.md` with YAML frontmatter
+ - Current opencode.nix:148 in nixpkgs — Shows config.json embedding approach (what we're moving away from)
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: OpenCode file-based agent format documented
+ Tool: Bash
+ Preconditions: Research complete
+ Steps:
+ 1. Read .sisyphus/evidence/task-4-opencode-agent-format.md
+ 2. Verify it documents: supported frontmatter fields, permission format, mode values, default behaviors
+ 3. Verify it confirms or denies: file-based agents don't need home-manager switch
+ Expected Result: Complete format documentation with concrete examples
+ Failure Indicators: Missing field documentation, unresolved questions about discovery behavior
+ Evidence: .sisyphus/evidence/task-4-opencode-agent-format.md
+ ```
+
+ **Commit**: NO (research only)
+
+- [x] 5. Create All 6 agent.toml + system-prompt.md Files
+
+ **What to do**:
+ - For each of the 6 agents, create `agents/{name}/agent.toml` following the schema from Task 3
+ - For each agent, copy (byte-identical!) the system prompt from `prompts/{name}.txt` to `agents/{name}/system-prompt.md`
+ - Agent directories to create: `chiron`, `chiron-forge`, `hermes`, `athena`, `apollo`, `calliope`
+ - Translate current JSON fields to TOML:
+ - `"Chiron (Assistant)"` → `name = "chiron"`, `display_name = "Chiron (Assistant)"`
+ - `"mode": "primary"` → `mode = "primary"`
+ - `"description": "..."` → `description = "..."`
+ - Permission objects → two-level `[permissions.TOOL]` tables
+ - Translate OpenCode's nested bash permission objects:
+ ```json
+ "bash": { "*": "ask", "git status*": "allow", ... }
+ ```
+ Into TOML:
+ ```toml
+ [permissions.bash]
+ intent = "ask"
+ rules = ["git status*:allow", "git log*:allow", ...]
+ ```
+ - Translate external_directory permissions similarly
+ - Skills, rules, context references per existing agent capabilities
+ - Verify EVERY toml file parses with `builtins.fromTOML`
+
+ **Must NOT do**:
+ - Change prompt content (byte-identical copy only)
+ - Include `model` field in agent.toml (per-machine concern)
+ - Delete old agents.json or prompts/ yet (Task 20)
+ - Add MCP config to agent.toml
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (depends on schema from Task 3)
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Tasks 6, 8, 9, 10, 11, 19
+ - **Blocked By**: Tasks 2, 3
+
+ **References**:
+ - `agents/agents.json` — Source data for all 6 agents (173 lines)
+ - `prompts/chiron.txt` through `prompts/calliope.txt` — System prompts to copy
+ - `agents/SCHEMA.md` (from Task 3) — Canonical schema to follow
+ - Task 2 results — Confirmed TOML parsing patterns
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: All 6 agent.toml files parse without error
+ Tool: Bash
+ Preconditions: All agents/*/agent.toml created
+ Steps:
+ 1. for f in agents/*/agent.toml; do nix eval --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f" || echo "FAIL: $f"; done
+ 2. Assert all 6 print "OK"
+ 3. Verify each has required fields: nix eval --expr '(builtins.fromTOML (builtins.readFile ./agents/chiron/agent.toml)).name' → "chiron"
+ Expected Result: All 6 TOML files parse, all have name + description
+ Failure Indicators: Any nix eval error, missing required fields
+ Evidence: .sisyphus/evidence/task-5-toml-parse-all.txt
+
+ Scenario: System prompts are byte-identical to originals
+ Tool: Bash
+ Preconditions: All agents/*/system-prompt.md created
+ Steps:
+ 1. diff prompts/chiron.txt agents/chiron/system-prompt.md
+ 2. diff prompts/chiron-forge.txt agents/chiron-forge/system-prompt.md
+ 3. diff prompts/hermes.txt agents/hermes/system-prompt.md
+ 4. diff prompts/athena.txt agents/athena/system-prompt.md
+ 5. diff prompts/apollo.txt agents/apollo/system-prompt.md
+ 6. diff prompts/calliope.txt agents/calliope/system-prompt.md
+ 7. All diffs must exit with code 0 (no differences)
+ Expected Result: Zero differences across all 6 files
+ Failure Indicators: Any diff showing changes
+ Evidence: .sisyphus/evidence/task-5-prompt-diff.txt
+
+ Scenario: Permission patterns preserved exactly
+ Tool: Bash
+ Preconditions: agents/chiron-forge/agent.toml exists
+ Steps:
+ 1. nix eval --expr '(builtins.fromTOML (builtins.readFile ./agents/chiron-forge/agent.toml)).permissions.bash.rules' --json
+ 2. Assert result contains: "rm -rf *:ask", "git reset --hard*:ask", "git push --force*:deny", "git push -f *:deny"
+ 3. nix eval --expr '(builtins.fromTOML (builtins.readFile ./agents/chiron/agent.toml)).permissions.bash.rules' --json
+ 4. Assert result contains at least 12 allow rules (git status*, git log*, etc.)
+ Expected Result: All glob patterns preserved with correct actions
+ Failure Indicators: Missing patterns, wrong action types, escaping issues
+ Evidence: .sisyphus/evidence/task-5-permissions.json
+ ```
+
+ **Commit**: YES
+ - Message: `feat: add canonical agent.toml definitions for all 6 agents`
+ - Files: `agents/*/agent.toml`, `agents/*/system-prompt.md`
+ - Pre-commit: `for f in agents/*/agent.toml; do nix eval --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null; done`
+
+---
+
+- [x] 6. Update AGENTS flake.nix with loadAgents + agentsJson Bridge
+
+ **What to do**:
+ - Add `lib.loadAgents` function to AGENTS repo's flake.nix:
+ - Reads all `agents/*/agent.toml` via `builtins.fromTOML (builtins.readFile ...)`
+ - Reads corresponding `system-prompt.md` via `builtins.readFile`
+ - Returns an attrset: `{ chiron = { name; description; mode; permissions; ...; systemPrompt = "..."; }; ... }`
+ - Discovery: reads `agents/` directory, filters for subdirs containing `agent.toml`
+ - Add `lib.agentsJson` backward-compat bridge function:
+ - Calls `loadAgents`, transforms back to current agents.json shape
+ - Maps canonical permission format back to OpenCode's nested objects
+ - Maps `systemPrompt` back to `"prompt": "{file:./prompts/chiron.txt}"` format (or inline)
+ - Adds `model` field from a configurable default (since agent.toml has no model)
+ - Keep ALL existing exports unchanged: `lib.mkOpencodeSkills`, `packages.skills-runtime`, `devShells.default`
+ - `lib` export must be system-independent (no `forAllSystems` wrapper — pure functions)
+
+ **Must NOT do**:
+ - Change mkOpencodeSkills
+ - Remove any existing exports
+ - Add renderer logic (that goes in nixpkgs)
+ - Hardcode machine-specific model assignments
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Task 7)
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Tasks 8, 17
+ - **Blocked By**: Tasks 3, 5
+
+ **References**:
+ - `flake.nix` — Current AGENTS flake (188 lines). Keep structure, add to `lib` section.
+ - `flake.nix:52-123` — `lib.mkOpencodeSkills` pattern (linkFarm approach)
+ - `agents/agents.json` — Target output shape for agentsJson bridge function
+ - `agents/SCHEMA.md` (from Task 3) — Canonical schema definition
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: loadAgents returns all 6 agents with correct structure
+ Tool: Bash
+ Preconditions: Task 5 complete, flake.nix updated
+ Steps:
+ 1. nix eval --json '.#lib.loadAgents' | jq 'keys | length'
+ 2. Assert output is 6
+ 3. nix eval --json '.#lib.loadAgents' | jq '.chiron.name'
+ 4. Assert output is "chiron"
+ 5. nix eval --json '.#lib.loadAgents' | jq '.["chiron-forge"].permissions.bash.intent'
+ 6. Assert output is "allow"
+ Expected Result: 6 agents loaded, all fields present
+ Failure Indicators: Eval error, wrong agent count, missing fields
+ Evidence: .sisyphus/evidence/task-6-loadagents.json
+
+ Scenario: agentsJson bridge matches golden file
+ Tool: Bash
+ Preconditions: Golden file from Task 1 available
+ Steps:
+ 1. nix eval --json '.#lib.agentsJson' | jq --sort-keys . > /tmp/agents-bridge-output.json
+ 2. diff /tmp/agents-bridge-output.json .sisyphus/evidence/agents-golden.json
+ 3. Exit code must be 0
+ Expected Result: Bridge output is semantically identical to original agents.json
+ Failure Indicators: Any diff (key ordering differences are OK if using jq --sort-keys)
+ Evidence: .sisyphus/evidence/task-6-bridge-diff.txt
+ ```
+
+ **Commit**: YES
+ - Message: `feat: export loadAgents and backward-compat agentsJson from flake`
+ - Files: `flake.nix`
+ - Pre-commit: `nix flake check && nix eval --json '.#lib.loadAgents' > /dev/null`
+
+---
+
+- [x] 7. Create lib/agents.nix in nixpkgs with loadCanonical
+
+ **What to do**:
+ - Create `/home/m3tam3re/p/NIX/nixpkgs/lib/agents.nix` with:
+ - `loadCanonical { agentsInput }` — reads canonical agents from the AGENTS flake input
+ - Calls `agentsInput.lib.loadAgents` (from Task 6) to get canonical attrset
+ - Returns the canonical attrset (or wraps/validates it)
+ - Stub functions for renderers (to be implemented in Tasks 9-11):
+ - `renderForOpencode { canonical; modelOverrides ? {}; }` → derivation placeholder
+ - `renderForClaudeCode { canonical; modelOverrides ? {}; }` → derivation placeholder
+ - `renderForPi { canonical; }` → derivation placeholder
+ - `renderForTool { agentsInput; tool; modelOverrides ? {}; }` → dispatcher
+ - Wire into `lib/default.nix` alongside existing `ports` and `opencode-rules`
+ - Follow existing lib patterns: `{lib}: { ... }` function signature
+
+ **Must NOT do**:
+ - Implement actual renderers yet (stubs only — Tasks 9-11)
+ - Import pkgs at lib level (renderers need pkgs, but the interface should accept it as argument)
+ - Modify existing lib functions
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Task 6)
+ - **Parallel Group**: Wave 2
+ - **Blocks**: Tasks 9, 10, 11, 12, 13, 14, 17
+ - **Blocked By**: Task 3
+
+ **References**:
+ - `lib/default.nix` in nixpkgs — Current lib exports (ports, opencode-rules). Add agents here.
+ - `lib/opencode-rules.nix` in nixpkgs — Pattern reference for lib function structure (116 lines)
+ - Task 3 SCHEMA.md — Defines the canonical attrset shape
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: lib/agents.nix loads and stub functions exist
+ Tool: Bash
+ Preconditions: lib/agents.nix created, lib/default.nix updated
+ Steps:
+ 1. nix eval --expr '(import ./lib { lib = (import {}).lib; }).agents' --json
+ 2. Assert result contains keys: loadCanonical, renderForOpencode, renderForClaudeCode, renderForPi, renderForTool
+ 3. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 4. Assert exit code 0
+ Expected Result: All stub functions exist, flake check passes
+ Failure Indicators: Import error, missing function names, flake check failure
+ Evidence: .sisyphus/evidence/task-7-lib-agents.json
+ ```
+
+ **Commit**: YES
+ - Message: `feat(lib): add agents.nix with loadCanonical and renderer stubs`
+ - Files: `lib/agents.nix`, `lib/default.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [x] 8. Verify Backward-Compat Bridge Produces Golden File Match
+
+ **What to do**:
+ - With Tasks 1, 5, 6 complete, run the full backward-compat verification:
+ ```bash
+ nix eval --json '.#lib.agentsJson' | jq --sort-keys . > /tmp/bridge-output.json
+ diff /tmp/bridge-output.json .sisyphus/evidence/agents-golden.json
+ ```
+ - If diff shows differences, debug and fix in Task 6's `agentsJson` function
+ - This is a GATE: do NOT proceed to Wave 3 until this passes
+ - Document any semantic differences that are acceptable (e.g., key ordering)
+
+ **Must NOT do**:
+ - Modify the golden file
+ - Accept content differences as "close enough"
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (gate task)
+ - **Parallel Group**: Wave 2 (runs last in wave)
+ - **Blocks**: Task 20
+ - **Blocked By**: Tasks 1, 5, 6
+
+ **References**:
+ - `.sisyphus/evidence/agents-golden.json` — Golden file from Task 1
+ - Task 6's `lib.agentsJson` — Bridge function to verify
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Bridge output matches golden file exactly
+ Tool: Bash
+ Preconditions: Tasks 1, 5, 6 complete
+ Steps:
+ 1. cd /home/m3tam3re/p/AI/AGENTS
+ 2. nix eval --json '.#lib.agentsJson' | jq --sort-keys . > /tmp/bridge-verify.json
+ 3. diff /tmp/bridge-verify.json .sisyphus/evidence/agents-golden.json
+ 4. Assert exit code 0 (zero differences)
+ Expected Result: Byte-identical output after jq normalization
+ Failure Indicators: Any diff output, non-zero exit code
+ Evidence: .sisyphus/evidence/task-8-bridge-verify.txt
+ ```
+
+ **Commit**: NO (verification only)
+
+- [x] 9. Implement OpenCode Renderer in lib/agents.nix
+
+ **What to do**:
+ - Replace the `renderForOpencode` stub in `lib/agents.nix` with full implementation
+ - Renderer produces a derivation containing `.opencode/agent/*.md` files (file-based agents)
+ - For each agent in canonical attrset, generate a markdown file with YAML frontmatter:
+ - `name`: from canonical `name`
+ - `description`: from canonical `description`
+ - `mode`: from canonical `mode` (primary/subagent) — MUST set explicitly (OpenCode defaults to "all")
+ - `model`: from `modelOverrides.{name}` if present, otherwise omit (let OpenCode use its default)
+ - `permission`: translate canonical two-level permissions to OpenCode's rule array format:
+ ```yaml
+ permission:
+ - permission: bash
+ pattern: "git status*"
+ action: allow
+ - permission: bash
+ pattern: "*"
+ action: ask
+ ```
+ - `steps`: from canonical `max_turns` if present
+ - Body of markdown = content of `system-prompt.md`
+ - Use `pkgs.writeText` or `pkgs.runCommand` to generate each file, then `pkgs.linkFarm` or `pkgs.symlinkJoin` to combine
+ - Handle edge case: agent with no permission rules (omit permission key entirely)
+
+ **Must NOT do**:
+ - Embed agents in config.json (use file-based agent path)
+ - Include oh-my-opencode.json or plugin config (that stays in opencode.nix)
+ - Hard-code model values
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 10, 11, 15, 16)
+ - **Parallel Group**: Wave 3
+ - **Blocks**: Task 12
+ - **Blocked By**: Tasks 4, 5, 7
+
+ **References**:
+ - Task 4 evidence — OpenCode file-based agent frontmatter format
+ - `agents/agents.json` — Current permission format (for output comparison)
+ - `lib/agents.nix` stubs from Task 7 — Replace renderForOpencode
+ - OpenCode source: agent file discovery logic
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Rendered OpenCode agents have correct frontmatter
+ Tool: Bash
+ Preconditions: Renderer implemented, AGENTS repo with canonical agents
+ Steps:
+ 1. Build rendered output: nix eval --raw '.#lib.x86_64-linux.agents.renderForOpencode { canonical = inputs.agents.lib.loadAgents; }'
+ 2. List files in rendered output: expect 6 .md files
+ 3. For chiron.md: extract YAML frontmatter, verify name="chiron", mode="primary", description present
+ 4. For chiron-forge.md: verify permission rules contain bash deny patterns for "rm -rf *", "git push --force*"
+ 5. For hermes.md: verify mode="subagent"
+ Expected Result: 6 agent files, correct frontmatter, correct permissions
+ Failure Indicators: Missing files, wrong mode, missing permissions
+ Evidence: .sisyphus/evidence/task-9-opencode-render.txt
+
+ Scenario: System prompts appear as markdown body
+ Tool: Bash
+ Preconditions: Rendered output available
+ Steps:
+ 1. Extract body (after frontmatter) from rendered chiron.md
+ 2. Compare with agents/chiron/system-prompt.md
+ 3. Assert byte-identical
+ Expected Result: Prompt content unchanged through rendering
+ Failure Indicators: Any content difference
+ Evidence: .sisyphus/evidence/task-9-prompt-body.txt
+ ```
+
+ **Commit**: YES (groups with N1)
+ - Message: `feat(lib): implement OpenCode renderer in agents.nix`
+ - Files: `lib/agents.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 10. Implement Claude Code Renderer in lib/agents.nix
+
+ **What to do**:
+ - Replace `renderForClaudeCode` stub with full implementation
+ - Renderer produces a derivation containing `.claude/agents/*.md` files AND `.claude/settings.json` fragment
+ - For each agent, generate markdown with YAML frontmatter:
+ - `name`: slugify canonical name to `[a-z0-9-]+` (e.g., "chiron-forge" stays, "Chiron" → "chiron")
+ - `description`: from canonical `description` (REQUIRED by Claude Code)
+ - `model`: from `modelOverrides.{name}` → map to Claude Code alias (sonnet/opus/haiku) or full ID
+ - `tools`: from canonical permissions — collect tool names where intent=allow into allowlist
+ - `disallowedTools`: from canonical permissions — collect tool names where intent=deny
+ - `permissionMode`: default to "default" unless canonical specifies
+ - `maxTurns`: from canonical `max_turns`
+ - `skills`: from canonical `skills` array
+ - Generate `.claude/settings.json` with permission rules translated to Claude Code DSL:
+ - Canonical `bash: { rules: ["git push*:deny"] }` → `permissions.deny: ["Bash(git push*)"]`
+ - Canonical `edit: { intent: "allow" }` → `permissions.allow: ["Edit"]`
+ - Body of markdown = content of `system-prompt.md`
+ - Handle subagent-only agents: Claude Code agents are always subagents (no "primary" mode)
+
+ **Must NOT do**:
+ - Include MCP server config in settings.json
+ - Include hooks (Claude Code exclusive concept, not in canonical)
+ - Use non-kebab-case names (Claude Code requires [a-z0-9-]+)
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 9, 11, 15, 16)
+ - **Parallel Group**: Wave 3
+ - **Blocks**: Task 13
+ - **Blocked By**: Tasks 5, 7
+
+ **References**:
+ - Claude Code sub-agents docs (indexed) — Frontmatter fields, tool names, permission syntax
+ - Claude Code settings docs (indexed) — Permission rule DSL: `"Bash(git diff *)"`, `"Read(./.env)"`
+ - `lib/agents.nix` stubs from Task 7
+ - Claude Code tool names: `Bash`, `Read`, `Edit`, `Write`, `Glob`, `Grep`, `WebFetch`, `Agent(type)`, `MCP(server::tool)`
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: All Claude Code agent files have valid YAML frontmatter
+ Tool: Bash
+ Preconditions: Renderer implemented
+ Steps:
+ 1. Build rendered output for claude-code
+ 2. For each .md file in .claude/agents/:
+ python3 -c "
+ import yaml, sys
+ content = open(sys.argv[1]).read()
+ parts = content.split('---', 2)
+ fm = yaml.safe_load(parts[1])
+ assert 'name' in fm, 'Missing name'
+ assert 'description' in fm, 'Missing description'
+ assert fm['name'].replace('-','').isalnum(), f'Invalid name: {fm[\"name\"]}'
+ print(f'OK: {fm[\"name\"]}')
+ " file.md
+ 3. Assert all 6 files pass
+ Expected Result: All frontmatter valid, names in kebab-case
+ Failure Indicators: YAML parse error, missing required fields, invalid name format
+ Evidence: .sisyphus/evidence/task-10-claude-frontmatter.txt
+
+ Scenario: Permission DSL correctly translated
+ Tool: Bash
+ Preconditions: Rendered .claude/settings.json exists
+ Steps:
+ 1. Read rendered .claude/settings.json
+ 2. Verify permissions.deny contains patterns like "Bash(rm -rf *)" for chiron-forge deny rules
+ 3. Verify permissions.allow contains patterns like "Bash(git status*)" for chiron allow rules
+ Expected Result: Permission rules correctly translated to Claude Code DSL
+ Failure Indicators: Missing rules, wrong DSL format, lost patterns
+ Evidence: .sisyphus/evidence/task-10-claude-permissions.json
+ ```
+
+ **Commit**: YES (groups with N1)
+ - Message: `feat(lib): implement Claude Code renderer in agents.nix`
+ - Files: `lib/agents.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 11. Implement Pi Renderer in lib/agents.nix
+
+ **What to do**:
+ - Replace `renderForPi` stub with full implementation
+ - Pi has NO subagent concept — renderer produces DIFFERENT outputs than OpenCode/Claude Code:
+ - `AGENTS.md` — Concatenation of all agent descriptions + primary agent's instructions
+ - `~/.pi/agent/SYSTEM.md` or `.pi/SYSTEM.md` — Primary agent's system prompt (replaces Pi's default prompt)
+ - `.pi/settings.json` fragment — Optional: tools list, model config
+ - Skill symlinks — Pi uses same SKILL.md dirs at `~/.pi/agent/skills/` or `.agents/skills/`
+ - Only PRIMARY agents render to SYSTEM.md. Subagent prompts get embedded as sections in AGENTS.md.
+ - Generate AGENTS.md with sections per agent:
+ ```markdown
+ # Agent Instructions
+
+ ## Chiron (Assistant)
+ Primary assistant for read-only analysis...
+
+ ## Available Specialists
+ - Hermes: Work communication (Basecamp, Outlook, Teams)
+ - Athena: Work knowledge (Outline wiki)
+ ...
+ ```
+ - Pi's tools config: `--tools read,bash,edit,write` maps from canonical permissions
+ - Handle: Pi has no permission granularity — only tool enable/disable
+
+ **Must NOT do**:
+ - Create agent files (Pi doesn't have them)
+ - Try to render subagents as separate entities
+ - Include MCP config (Pi uses extensions instead)
+ - Create TS extensions (out of scope)
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 9, 10, 15, 16)
+ - **Parallel Group**: Wave 3
+ - **Blocks**: Task 14
+ - **Blocked By**: Tasks 5, 7
+
+ **References**:
+ - Pi README (indexed) — AGENTS.md loaded at startup, SYSTEM.md replaces default prompt, APPEND_SYSTEM.md appends
+ - Pi README skills section — `~/.pi/agent/skills/`, `.pi/skills/`, `~/.agents/skills/`, `.agents/skills/`
+ - Pi README settings — `~/.pi/agent/settings.json` (global), `.pi/settings.json` (project)
+ - Pi README tools — `--tools read,bash,edit,write` (default built-in tools)
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Pi renderer produces valid AGENTS.md
+ Tool: Bash
+ Preconditions: Renderer implemented
+ Steps:
+ 1. Build rendered output for pi
+ 2. Assert AGENTS.md exists in output
+ 3. Assert AGENTS.md contains "Chiron" and agent descriptions
+ 4. Assert AGENTS.md contains specialist listing
+ 5. Verify AGENTS.md is valid Markdown (no TOML/JSON artifacts)
+ Expected Result: AGENTS.md exists with readable agent instructions
+ Failure Indicators: File missing, contains raw TOML/JSON, empty content
+ Evidence: .sisyphus/evidence/task-11-pi-agents-md.txt
+
+ Scenario: Pi renderer produces valid SYSTEM.md from primary agent
+ Tool: Bash
+ Preconditions: Rendered output available
+ Steps:
+ 1. Assert SYSTEM.md or .pi/SYSTEM.md exists in output
+ 2. Content should be the primary agent's system prompt
+ 3. Verify it matches agents/chiron/system-prompt.md content
+ Expected Result: SYSTEM.md exists with primary agent's prompt
+ Failure Indicators: Missing file, wrong content, subagent prompt instead
+ Evidence: .sisyphus/evidence/task-11-pi-system-md.txt
+ ```
+
+ **Commit**: YES (groups with N1)
+ - Message: `feat(lib): implement Pi renderer in agents.nix`
+ - Files: `lib/agents.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 12. Create HM Sub-Module for OpenCode (agents/opencode.nix)
+
+ **What to do**:
+ - Create `modules/home-manager/coding/agents/opencode.nix` in nixpkgs
+ - Options under `coding.agents.opencode`:
+ - `enable` — mkEnableOption
+ - `agentsInput` — flake input pointing to AGENTS repo
+ - `modelOverrides` — attrset mapping agent name → model string (e.g., `{ chiron = "anthropic/claude-sonnet-4"; }`)
+ - Config (mkIf enabled):
+ - Call `lib.agents.renderForOpencode { canonical; modelOverrides; }` to get rendered derivation
+ - Symlink rendered `.opencode/agent/` dir via `xdg.configFile` or `home.file`
+ - Symlink skills via existing `mkOpencodeSkills` (if agentsInput set)
+ - Symlink context/ and commands/ from AGENTS input
+ - Create `modules/home-manager/coding/agents/default.nix` aggregator importing opencode.nix, claude-code.nix, pi.nix
+ - Update `modules/home-manager/coding/default.nix` to import `./agents` subdir
+
+ **Must NOT do**:
+ - Handle oh-my-opencode.json, plugins, formatters (stays in slimmed opencode.nix)
+ - Embed agents in config.json (use file-based agents)
+ - Include MCP config
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (depends on Task 9)
+ - **Parallel Group**: Wave 3 (after Task 9)
+ - **Blocks**: Tasks 18, 21
+ - **Blocked By**: Task 9
+
+ **References**:
+ - `modules/home-manager/coding/opencode.nix` in nixpkgs — Current module to learn from (168 lines)
+ - Task 9's renderer — Produces the derivation this module consumes
+ - `modules/home-manager/AGENTS.md` in nixpkgs — Module conventions doc
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Module options type-check
+ Tool: Bash
+ Preconditions: Module created
+ Steps:
+ 1. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 2. Assert exit code 0 (no type errors in module options)
+ Expected Result: Flake check passes
+ Failure Indicators: Type error in options, missing import
+ Evidence: .sisyphus/evidence/task-12-flake-check.txt
+ ```
+
+ **Commit**: YES (groups with N2)
+ - Message: `feat(hm): add OpenCode agent sub-module`
+ - Files: `modules/home-manager/coding/agents/opencode.nix`, `modules/home-manager/coding/agents/default.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 13. Create HM Sub-Module for Claude Code (agents/claude-code.nix)
+
+ **What to do**:
+ - Create `modules/home-manager/coding/agents/claude-code.nix` in nixpkgs
+ - Options under `coding.agents.claude-code`:
+ - `enable` — mkEnableOption
+ - `agentsInput` — flake input pointing to AGENTS repo
+ - `modelOverrides` — attrset mapping agent name → model alias or ID
+ - Config (mkIf enabled):
+ - Call `lib.agents.renderForClaudeCode { canonical; modelOverrides; }` to get rendered derivation
+ - Symlink rendered `.claude/agents/` via `home.file`
+ - Generate `.claude/settings.json` with rendered permission rules
+ - Symlink skills from AGENTS repo to `~/.claude/skills/` (if skills exist)
+ - Handle: Claude Code's `CLAUDE.md` — optionally generate from agent instructions
+
+ **Must NOT do**:
+ - Manage Claude Code's MCP config (.claude.json)
+ - Configure Claude Code API keys or auth
+ - Include hooks in settings.json
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (depends on Task 10)
+ - **Parallel Group**: Wave 3 (after Task 10)
+ - **Blocks**: Tasks 18, 21
+ - **Blocked By**: Task 10
+
+ **References**:
+ - Claude Code settings docs (indexed) — `.claude/` directory structure, settings.json scopes
+ - Task 10's renderer — Produces the derivation this module consumes
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Module type-checks and creates expected file paths
+ Tool: Bash
+ Preconditions: Module created
+ Steps:
+ 1. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 2. Assert exit code 0
+ Expected Result: Flake check passes
+ Failure Indicators: Type error, missing import
+ Evidence: .sisyphus/evidence/task-13-flake-check.txt
+ ```
+
+ **Commit**: YES (groups with N2)
+ - Message: `feat(hm): add Claude Code agent sub-module`
+ - Files: `modules/home-manager/coding/agents/claude-code.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 14. Create HM Sub-Module for Pi (agents/pi.nix)
+
+ **What to do**:
+ - Create `modules/home-manager/coding/agents/pi.nix` in nixpkgs
+ - Options under `coding.agents.pi`:
+ - `enable` — mkEnableOption
+ - `agentsInput` — flake input pointing to AGENTS repo
+ - Config (mkIf enabled):
+ - Call `lib.agents.renderForPi { canonical; }` to get rendered derivation
+ - Place AGENTS.md at `~/.pi/agent/AGENTS.md` via `home.file`
+ - Place SYSTEM.md at `~/.pi/agent/SYSTEM.md` via `home.file`
+ - Symlink skills from AGENTS repo to `~/.pi/agent/skills/`
+ - Optionally symlink prompts from AGENTS repo to `~/.pi/agent/prompts/` (Pi's prompt templates)
+
+ **Must NOT do**:
+ - Create fake agent files (Pi has no subagents)
+ - Configure Pi extensions (TypeScript, out of scope)
+ - Manage Pi's package system
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (depends on Task 11)
+ - **Parallel Group**: Wave 3 (after Task 11)
+ - **Blocks**: Tasks 18, 21
+ - **Blocked By**: Task 11
+
+ **References**:
+ - Pi README (indexed) — `~/.pi/agent/` directory structure, skill paths, prompt template paths
+ - Task 11's renderer — Produces the derivation this module consumes
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Module type-checks
+ Tool: Bash
+ Preconditions: Module created
+ Steps:
+ 1. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 2. Assert exit code 0
+ Expected Result: Flake check passes
+ Failure Indicators: Type error, missing import
+ Evidence: .sisyphus/evidence/task-14-flake-check.txt
+ ```
+
+ **Commit**: YES (groups with N2)
+ - Message: `feat(hm): add Pi agent sub-module`
+ - Files: `modules/home-manager/coding/agents/pi.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 15. Slim Down opencode.nix to Non-Agent Config Only
+
+ **What to do**:
+ - Edit existing `modules/home-manager/coding/opencode.nix` in nixpkgs
+ - REMOVE: `agentsInput` option (moved to agents/opencode.nix)
+ - REMOVE: `externalSkills` option (moved to agents/opencode.nix)
+ - REMOVE: Skills linkFarm generation (moved to agents/opencode.nix)
+ - REMOVE: Context/commands/prompts symlinks (moved to agents/opencode.nix)
+ - REMOVE: agents.json embedding (`builtins.fromJSON (builtins.readFile ...)`) (replaced by file-based agents)
+ - KEEP: `programs.opencode.enable` + `enableMcpIntegration`
+ - KEEP: `programs.opencode.settings` with theme, formatter, plugin array
+ - KEEP: `ohMyOpencodeSettings` → `oh-my-opencode.json` generation
+ - KEEP: `extraSettings` for provider/machine-specific config
+ - KEEP: `extraPlugins`
+ - Result: opencode.nix handles ONLY tool-specific, non-agent config
+
+ **Must NOT do**:
+ - Delete opencode.nix entirely (it still handles non-agent concerns)
+ - Move oh-my-opencode.json to agents module
+ - Change option names that other configs depend on (check consumers first)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 9-14, 16)
+ - **Parallel Group**: Wave 3
+ - **Blocks**: Task 18
+ - **Blocked By**: None (but coordinate with Task 12 for import order)
+
+ **References**:
+ - `modules/home-manager/coding/opencode.nix` in nixpkgs — Current module (168 lines, will shrink to ~70)
+ - Task 12 — New agents/opencode.nix takes over agent concerns
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Slimmed opencode.nix still manages non-agent config
+ Tool: Bash
+ Preconditions: opencode.nix edited
+ Steps:
+ 1. Verify opencode.nix still has: ohMyOpencodeSettings, extraSettings, extraPlugins options
+ 2. Verify opencode.nix does NOT have: agentsInput, externalSkills options
+ 3. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 4. Assert exit code 0
+ Expected Result: Module compiles, non-agent options preserved, agent options removed
+ Failure Indicators: Missing options that should stay, leftover agent options
+ Evidence: .sisyphus/evidence/task-15-opencode-slim.txt
+ ```
+
+ **Commit**: YES (groups with N3)
+ - Message: `refactor(hm): slim opencode.nix to non-agent config only`
+ - Files: `modules/home-manager/coding/opencode.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 16. Rename mkOpencodeRules to mkCodingRules with Backward-Compat Alias
+
+ **What to do**:
+ - In `lib/opencode-rules.nix`: rename the main function to `mkCodingRules`
+ - Add backward-compat alias: `mkOpencodeRules = builtins.trace "m3ta-nixpkgs: mkOpencodeRules is deprecated, use mkCodingRules" mkCodingRules;`
+ - Rename file: `lib/opencode-rules.nix` → `lib/coding-rules.nix`
+ - Update `lib/default.nix`: expose both `coding-rules.mkCodingRules` and `opencode-rules.mkOpencodeRules` (alias)
+ - For now, the function body stays identical — tool-agnostic rule rendering is a future enhancement
+
+ **Must NOT do**:
+ - Change the function's behavior or output
+ - Remove the old name entirely (backward compat)
+ - Add multi-tool rendering logic yet
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 9-15)
+ - **Parallel Group**: Wave 3
+ - **Blocks**: Task 18
+ - **Blocked By**: None
+
+ **References**:
+ - `lib/opencode-rules.nix` in nixpkgs — Current file (116 lines)
+ - `lib/default.nix` in nixpkgs — Current exports
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Both old and new names work
+ Tool: Bash
+ Preconditions: Rename complete
+ Steps:
+ 1. nix eval --expr '(import ./lib { lib = (import {}).lib; }).coding-rules.mkCodingRules' --json
+ 2. Assert function exists (no error)
+ 3. nix eval --expr '(import ./lib { lib = (import {}).lib; }).opencode-rules.mkOpencodeRules' --json
+ 4. Assert function exists (backward compat, may show deprecation trace)
+ Expected Result: Both names resolve to the same function
+ Failure Indicators: Either name fails, function behavior changed
+ Evidence: .sisyphus/evidence/task-16-rules-rename.txt
+ ```
+
+ **Commit**: YES (groups with N5)
+ - Message: `refactor(lib): rename mkOpencodeRules to mkCodingRules with compat alias`
+ - Files: `lib/coding-rules.nix`, `lib/default.nix`
+ - Pre-commit: `nix flake check`
+
+- [ ] 17. Add Project-Level renderForTool Lib Function
+
+ **What to do**:
+ - Implement `renderForTool` dispatcher in `lib/agents.nix`:
+ ```nix
+ renderForTool = { pkgs, agentsInput, tool, modelOverrides ? {} }:
+ let
+ canonical = agentsInput.lib.loadAgents;
+ renderers = {
+ opencode = renderForOpencode { inherit pkgs canonical modelOverrides; };
+ claude-code = renderForClaudeCode { inherit pkgs canonical modelOverrides; };
+ pi = renderForPi { inherit pkgs canonical; };
+ };
+ in renderers.${tool} or (throw "Unknown tool: ${tool}");
+ ```
+ - Add `shellHookForTool` helper that generates a shellHook placing rendered files in project dir:
+ - For OpenCode: symlinks `.opencode/agent/` → rendered derivation
+ - For Claude Code: symlinks `.claude/agents/` and `.claude/settings.json` → rendered
+ - For Pi: symlinks `.pi/SYSTEM.md` and `AGENTS.md` → rendered
+ - All shellHooks add appropriate entries to `.gitignore` if not already present
+ - Export via `lib.agents.renderForTool` and `lib.agents.shellHookForTool`
+ - Usage in project flake.nix:
+ ```nix
+ devShells.default = pkgs.mkShell {
+ shellHook = m3taLib.agents.shellHookForTool {
+ inherit pkgs;
+ agentsInput = inputs.agents;
+ tool = "opencode";
+ modelOverrides = { chiron = "anthropic/claude-sonnet-4"; };
+ };
+ };
+ ```
+
+ **Must NOT do**:
+ - Write files imperatively (use symlinks to Nix store paths)
+ - Assume tool from environment (require explicit `tool` argument)
+
+ **Recommended Agent Profile**:
+ - **Category**: `deep`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO
+ - **Parallel Group**: Wave 4
+ - **Blocks**: Task 21
+ - **Blocked By**: Tasks 6, 7 (and implicitly 9-11)
+
+ **References**:
+ - `lib/opencode-rules.nix:106-114` in nixpkgs — shellHook pattern reference (ln -sfn + cat > file)
+ - Task 9-11 renderers — Functions this dispatcher calls
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: renderForTool dispatches correctly
+ Tool: Bash
+ Preconditions: All renderers implemented
+ Steps:
+ 1. nix eval --raw '.#lib.x86_64-linux.agents.renderForTool { pkgs = import {}; agentsInput = inputs.agents; tool = "opencode"; }'
+ 2. Assert output is a valid store path
+ 3. List contents — expect .opencode/agent/*.md files
+ 4. Repeat for tool = "claude-code" — expect .claude/agents/*.md
+ 5. Repeat for tool = "pi" — expect AGENTS.md + SYSTEM.md
+ Expected Result: Each tool produces correct output structure
+ Failure Indicators: Eval error, wrong output structure, unknown tool error
+ Evidence: .sisyphus/evidence/task-17-renderForTool.txt
+ ```
+
+ **Commit**: YES (groups with N4)
+ - Message: `feat(lib): add project-level renderForTool function`
+ - Files: `lib/agents.nix`
+ - Pre-commit: `nix flake check`
+
+---
+
+- [ ] 18. Update nixpkgs flake.nix Exports + Aggregator Imports
+
+ **What to do**:
+ - Update `modules/home-manager/coding/default.nix` to import `./agents` subdir:
+ ```nix
+ imports = [
+ ./editors.nix
+ ./opencode.nix
+ ./agents
+ ];
+ ```
+ - Update `flake.nix` homeManagerModules exports:
+ - Keep: `default`, `ports`, `zellij-ps`
+ - Keep: `opencode` (slimmed version)
+ - Add: `agents` pointing to `./modules/home-manager/coding/agents`
+ - Remove or deprecate old `opencode` if fully replaced
+ - Update `lib/default.nix` to export agents module:
+ ```nix
+ agents = import ./agents.nix { inherit lib; };
+ coding-rules = import ./coding-rules.nix { inherit lib; };
+ opencode-rules = import ./coding-rules.nix { inherit lib; }; # backward compat
+ ```
+ - Run `nix fmt` (alejandra) on all changed files
+ - Run `nix flake check`
+
+ **Must NOT do**:
+ - Remove `opencode` export without backward compat
+ - Change export names that external configs depend on
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (depends on all Wave 3 tasks)
+ - **Parallel Group**: Wave 4
+ - **Blocks**: Task 21
+ - **Blocked By**: Tasks 12, 13, 14, 15, 16
+
+ **References**:
+ - `flake.nix` in nixpkgs — Current exports (lines 78-83)
+ - `modules/home-manager/coding/default.nix` — Current aggregator
+ - `lib/default.nix` — Current lib exports
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: All exports resolve without error
+ Tool: Bash
+ Preconditions: All modules and lib functions created
+ Steps:
+ 1. nix flake check /home/m3tam3re/p/NIX/nixpkgs
+ 2. nix eval '.#homeManagerModules' --json | jq 'keys'
+ 3. Assert keys include: "default", "opencode", "agents", "ports", "zellij-ps"
+ 4. nix fmt --check /home/m3tam3re/p/NIX/nixpkgs
+ 5. Assert no formatting changes needed
+ Expected Result: All exports work, formatting clean
+ Failure Indicators: Missing export, eval error, formatting drift
+ Evidence: .sisyphus/evidence/task-18-exports.txt
+ ```
+
+ **Commit**: YES (groups with N6)
+ - Message: `chore: update flake exports and aggregator imports`
+ - Files: `flake.nix`, `modules/home-manager/coding/default.nix`, `lib/default.nix`
+ - Pre-commit: `nix flake check && nix fmt --check`
+
+---
+
+- [ ] 19. Update AGENTS.md Documentation
+
+ **What to do**:
+ - Update `/home/m3tam3re/p/AI/AGENTS/AGENTS.md` to reflect new directory structure
+ - Document:
+ - New `agents/{name}/agent.toml` + `system-prompt.md` structure
+ - The canonical TOML schema (reference SCHEMA.md)
+ - How renderers work (live in nixpkgs, not here)
+ - How to add a new agent
+ - How project-level usage works (flake.nix + direnv)
+ - Backward-compat bridge (`lib.agentsJson`) — note as temporary
+ - Update directory tree diagram
+ - Remove references to `agents/agents.json` as canonical source
+ - Keep references to skills/, rules/, context/, commands/ unchanged
+
+ **Must NOT do**:
+ - Create README.md (update existing AGENTS.md)
+ - Document nixpkgs internals (that's nixpkgs's AGENTS.md responsibility)
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 17, 18, 20)
+ - **Parallel Group**: Wave 4
+ - **Blocks**: None
+ - **Blocked By**: Task 5
+
+ **References**:
+ - `/home/m3tam3re/p/AI/AGENTS/AGENTS.md` — Current documentation
+ - Task 3's SCHEMA.md — Schema to reference
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: AGENTS.md reflects new structure
+ Tool: Bash
+ Preconditions: AGENTS.md updated
+ Steps:
+ 1. grep "agent.toml" AGENTS.md — assert found
+ 2. grep "system-prompt.md" AGENTS.md — assert found
+ 3. grep "agents.json" AGENTS.md — should NOT appear as "canonical" or "source of truth"
+ Expected Result: Documentation reflects canonical TOML format
+ Failure Indicators: References to old agents.json as primary, missing new structure docs
+ Evidence: .sisyphus/evidence/task-19-docs-check.txt
+ ```
+
+ **Commit**: YES (groups with A4)
+ - Message: `docs: update AGENTS.md for canonical agent format`
+ - Files: `AGENTS.md`
+
+---
+
+- [ ] 20. Remove Legacy agents.json + prompts/*.txt from AGENTS Repo
+
+ **What to do**:
+ - ONLY after Task 8 confirms backward-compat bridge works
+ - ONLY after nixpkgs modules consume new canonical format (Tasks 12-14 complete)
+ - Delete `agents/agents.json`
+ - Delete `prompts/chiron.txt`, `prompts/chiron-forge.txt`, `prompts/hermes.txt`, `prompts/athena.txt`, `prompts/apollo.txt`, `prompts/calliope.txt`
+ - Delete `prompts/` directory if empty
+ - Remove `lib.agentsJson` backward-compat function from flake.nix
+ - Verify `nix flake check` still passes after removal
+
+ **Must NOT do**:
+ - Remove before nixpkgs consumers are updated
+ - Remove system-prompt.md files (those are the NEW canonical prompts)
+ - Remove skills/, rules/, context/, commands/
+
+ **Recommended Agent Profile**:
+ - **Category**: `quick`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: YES (with Tasks 17, 18, 19)
+ - **Parallel Group**: Wave 4
+ - **Blocks**: None
+ - **Blocked By**: Task 8 (golden file match confirmed)
+
+ **References**:
+ - `agents/agents.json` — File to delete
+ - `prompts/*.txt` — Files to delete
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Legacy files removed, canonical files remain
+ Tool: Bash
+ Preconditions: Tasks 8, 12-14 confirmed complete
+ Steps:
+ 1. test ! -f agents/agents.json — assert file does NOT exist
+ 2. test ! -d prompts/ — assert directory does NOT exist (or is empty)
+ 3. for d in agents/chiron agents/chiron-forge agents/hermes agents/athena agents/apollo agents/calliope; do
+ test -f "$d/agent.toml" && test -f "$d/system-prompt.md" && echo "OK: $d"
+ done
+ 4. Assert all 6 directories have both files
+ 5. nix flake check — assert passes
+ Expected Result: Legacy removed, canonical intact, flake passes
+ Failure Indicators: Legacy files still present, canonical files missing, flake error
+ Evidence: .sisyphus/evidence/task-20-cleanup.txt
+ ```
+
+ **Commit**: YES (groups with A3)
+ - Message: `chore: remove legacy agents.json and prompts/*.txt`
+ - Files: `agents/agents.json` (deleted), `prompts/*.txt` (deleted), `flake.nix` (remove agentsJson)
+
+---
+
+- [ ] 21. End-to-End Integration Test Across Both Repos
+
+ **What to do**:
+ - Full cross-repo integration verification:
+ 1. In AGENTS repo: `nix eval --json '.#lib.loadAgents'` → verify 6 agents with all fields
+ 2. In nixpkgs: simulate home-manager eval with agents input:
+ - OpenCode: rendered agents dir contains 6 .md files with correct frontmatter
+ - Claude Code: rendered .claude/agents/ contains 6 .md files with valid YAML + required fields
+ - Pi: rendered output contains AGENTS.md + SYSTEM.md
+ 3. Project-level: test `renderForTool` for each tool
+ 4. Skills: verify `mkOpencodeSkills` still produces correct output
+ 5. Formatting: `nix fmt --check` on both repos
+ 6. Flake checks: `nix flake check` on both repos
+ - Document all results in evidence files
+
+ **Must NOT do**:
+ - Modify any source files (verification only)
+ - Skip any tool's verification
+
+ **Recommended Agent Profile**:
+ - **Category**: `unspecified-high`
+ - **Skills**: []
+
+ **Parallelization**:
+ - **Can Run In Parallel**: NO (integration gate)
+ - **Parallel Group**: Wave 4 (runs last)
+ - **Blocks**: F1-F4
+ - **Blocked By**: Tasks 1, 12, 13, 14, 17, 18
+
+ **References**:
+ - All previous task evidence files
+ - Both repo flake.nix files
+
+ **Acceptance Criteria**:
+
+ **QA Scenarios (MANDATORY):**
+
+ ```
+ Scenario: Full pipeline works end-to-end
+ Tool: Bash
+ Preconditions: All tasks 1-20 complete
+ Steps:
+ 1. cd /home/m3tam3re/p/AI/AGENTS && nix flake check && echo "AGENTS: OK"
+ 2. cd /home/m3tam3re/p/NIX/nixpkgs && nix flake check && echo "nixpkgs: OK"
+ 3. nix eval --json '/home/m3tam3re/p/AI/AGENTS#lib.loadAgents' | jq 'keys | length' — assert 6
+ 4. Test each renderer produces output without error
+ 5. nix fmt --check /home/m3tam3re/p/AI/AGENTS — assert clean
+ 6. nix fmt --check /home/m3tam3re/p/NIX/nixpkgs — assert clean
+ Expected Result: Both repos pass all checks, all renderers produce output
+ Failure Indicators: Any flake check failure, renderer error, format drift
+ Evidence: .sisyphus/evidence/task-21-e2e.txt
+
+ Scenario: Skills composition unchanged
+ Tool: Bash
+ Preconditions: mkOpencodeSkills not modified
+ Steps:
+ 1. nix eval --raw '/home/m3tam3re/p/AI/AGENTS#lib.mkOpencodeSkills { pkgs = import {}; customSkills = ./skills; }'
+ 2. List contents of output directory
+ 3. Assert contains all active skill directories
+ Expected Result: Skills output identical to before migration
+ Failure Indicators: Missing skills, broken linkFarm
+ Evidence: .sisyphus/evidence/task-21-skills.txt
+ ```
+
+ **Commit**: NO (verification only)
+
+---
+
+## Final Verification Wave (MANDATORY — after ALL implementation tasks)
+
+> 4 review agents run in PARALLEL. ALL must APPROVE. Present consolidated results to user and get explicit "okay" before completing.
+>
+> **Do NOT auto-proceed after verification. Wait for user's explicit approval before marking work complete.**
+
+- [ ] F1. **Plan Compliance Audit** — `oracle`
+ Read the plan end-to-end. For each "Must Have": verify implementation exists (read file, nix eval, diff). For each "Must NOT Have": search codebase for forbidden patterns — reject with file:line if found. Check evidence files exist in .sisyphus/evidence/. Compare deliverables against plan.
+ Output: `Must Have [N/N] | Must NOT Have [N/N] | Tasks [N/N] | VERDICT: APPROVE/REJECT`
+
+- [ ] F2. **Code Quality Review** — `unspecified-high`
+ Run `nix flake check` on both repos. Run `nix fmt --check` (alejandra). Review all .nix files for: unused variables, hardcoded paths, missing mkIf guards, type errors. Check TOML files parse without error. Verify no AI slop: no excessive comments, no placeholder values, no TODO markers in production code.
+ Output: `Flake Check [PASS/FAIL] | Format [PASS/FAIL] | Nix Quality [N clean/N issues] | TOML Parse [N/N] | VERDICT`
+
+- [ ] F3. **Real Manual QA** — `unspecified-high`
+ Execute EVERY QA scenario from EVERY task. Capture evidence. Test cross-task integration: AGENTS repo `lib.loadAgents` → nixpkgs `loadCanonical` → each renderer → home-manager module output. Test edge cases: agent with many permission rules, agent with minimal config, model override. Save to `.sisyphus/evidence/final-qa/`.
+ Output: `Scenarios [N/N pass] | Integration [N/N] | Edge Cases [N tested] | VERDICT`
+
+- [ ] F4. **Scope Fidelity Check** — `deep`
+ For each task: read "What to do", read actual changes. Verify 1:1 — everything in spec was built (no missing), nothing beyond spec was built (no creep). Check "Must NOT do" compliance. Detect: skills/rules changes (forbidden), MCP in agent.toml (forbidden), Codex/Aider renderers (forbidden), prompt content changes (forbidden). Flag unaccounted changes.
+ Output: `Tasks [N/N compliant] | Scope [CLEAN/N issues] | Forbidden Patterns [CLEAN/N found] | VERDICT`
+
+---
+
+## Commit Strategy
+
+### AGENTS Repo
+- **Commit A1**: `feat: add canonical agent.toml definitions for all 6 agents` — agents/*/agent.toml + system-prompt.md
+- **Commit A2**: `feat: export loadAgents and backward-compat agentsJson from flake` — flake.nix updates
+- **Commit A3** (after nixpkgs consuming): `chore: remove legacy agents.json and prompts/*.txt`
+- **Commit A4**: `docs: update AGENTS.md for canonical agent format`
+
+### m3ta-nixpkgs
+- **Commit N1**: `feat(lib): add agents.nix with loadCanonical and 3 tool renderers`
+- **Commit N2**: `feat(hm): add per-tool agent HM sub-modules (opencode, claude-code, pi)`
+- **Commit N3**: `refactor(hm): slim opencode.nix to non-agent config only`
+- **Commit N4**: `feat(lib): add project-level renderForTool function`
+- **Commit N5**: `refactor(lib): rename mkOpencodeRules to mkCodingRules with compat alias`
+- **Commit N6**: `chore: update flake exports and aggregator imports`
+
+---
+
+## Success Criteria
+
+### Verification Commands
+```bash
+# AGENTS repo: all TOML files parse
+for f in agents/*/agent.toml; do nix eval --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null; done
+
+# AGENTS repo: backward compat bridge
+diff <(nix eval --json '.#lib.x86_64-linux.agentsJson' | jq --sort-keys .) /tmp/agents-golden.json
+
+# AGENTS repo: prompts unchanged
+for agent in chiron chiron-forge hermes athena apollo calliope; do diff "prompts/$agent.txt" "agents/$agent/system-prompt.md"; done
+
+# nixpkgs: flake check
+nix flake check /home/m3tam3re/p/NIX/nixpkgs
+
+# nixpkgs: formatting
+nix fmt --check /home/m3tam3re/p/NIX/nixpkgs
+
+# nixpkgs: OpenCode golden file match
+diff <(nix eval --json '.#homeConfigurations.sk.config.xdg.configFile."opencode/agents"' | jq --sort-keys .) /tmp/opencode-agents-golden.json
+```
+
+### Final Checklist
+- [ ] All 6 agents have both `agent.toml` and `system-prompt.md`
+- [ ] All "Must Have" items present and verified
+- [ ] All "Must NOT Have" items absent
+- [ ] `nix flake check` passes on both repos
+- [ ] `nix fmt` produces no changes on both repos
+- [ ] Golden file comparison passes (OpenCode output unchanged)
+- [ ] Claude Code frontmatter valid (name + description present, kebab-case)
+- [ ] Pi output valid (AGENTS.md exists, optional JSON valid)
+- [ ] `lib.mkOpencodeSkills` unchanged and functional
+- [ ] Prompt content byte-identical to originals
diff --git a/AGENTS.md b/AGENTS.md
index 4b19258..9f13220 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,6 +1,6 @@
-# Opencode Skills Repository
+# Agent Skills Repository
-Configuration repository for Opencode Agent Skills, context files, and agent configurations. Deployed via Nix home-manager to `~/.config/opencode/`.
+Configuration repository for AI Agent Skills, canonical agent definitions, context files, and agent configurations. Deployed via Nix home-manager to `~/.config/opencode/` (or equivalent paths for other tools).
## Quick Commands
@@ -12,6 +12,9 @@ Configuration repository for Opencode Agent Skills, context files, and agent con
# Skill creation
python3 skills/skill-creator/scripts/init_skill.py --path skills/
+
+# Verify agent TOML parses
+for f in agents/*/agent.toml; do nix eval --impure --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f"; done
```
## Directory Structure
@@ -28,8 +31,11 @@ python3 skills/skill-creator/scripts/init_skill.py --path skills/
│ ├── languages/ # Python, TypeScript, Nix, Shell
│ ├── concerns/ # Testing, naming, documentation, etc.
│ └── frameworks/ # Framework-specific rules (n8n, etc.)
-├── agents/ # Agent definitions (agents.json)
-├── prompts/ # System prompts (chiron*.txt)
+├── agents/ # Canonical agent definitions (harness-agnostic)
+│ ├── SCHEMA.md # Canonical agent.toml schema definition
+│ └── /
+│ ├── agent.toml # Agent metadata, permissions, references
+│ └── system-prompt.md # Agent system prompt (markdown)
├── context/ # User profiles
├── commands/ # Custom commands
└── scripts/ # Repo utilities (test-skill.sh, validate-agents.sh)
@@ -76,6 +82,42 @@ compatibility: opencode
- `systematic-debugging/test-*.md` - Academic/pressure testing in wrong location
- `pdf/forms.md`, `pdf/reference.md` - Docs outside references/
+## Canonical Agent Format
+
+Agent definitions live in `agents//agent.toml` + `agents//system-prompt.md`.
+This is a **harness-agnostic** format — renderers in m3ta-nixpkgs generate tool-specific configs.
+
+See `agents/SCHEMA.md` for the full schema definition.
+
+### Adding a new agent
+
+1. Create `agents//agent.toml` with required fields (`name`, `description`) and optional fields (`mode`, `permissions`, etc.)
+2. Create `agents//system-prompt.md` with the agent's system prompt
+3. Verify: `nix eval --impure --expr 'builtins.fromTOML (builtins.readFile ./agents//agent.toml)' --json`
+4. Add the agent to renderers by updating the consuming flake inputs
+
+### How renderers work
+
+Renderers live in **m3ta-nixpkgs** (not this repo). They consume `lib.loadAgents` and produce:
+
+| Tool | Output | Path |
+|------|--------|------|
+| OpenCode | `.opencode/agents/*.md` | `~/.config/opencode/agents/` |
+| Claude Code | `.claude/agents/*.md` + `settings.json` | `~/.claude/` |
+| Pi | `AGENTS.md` + `SYSTEM.md` | `~/.pi/agent/` |
+
+### Project-level usage
+
+```nix
+# In project flake.nix
+m3taLib.agents.shellHookForTool {
+ inherit pkgs;
+ agentsInput = inputs.agents;
+ tool = "opencode";
+ modelOverrides = { chiron = "anthropic/claude-sonnet-4"; };
+};
+```
+
## Deployment
**Nix flake pattern**:
@@ -87,16 +129,17 @@ agents = {
```
**Exports:**
+- `lib.loadAgents` — loads all canonical `agents/*/agent.toml` + `system-prompt.md` into an attrset
- `lib.mkOpencodeSkills` — compose custom + external [skills.sh](https://skills.sh) skills into one directory
+- `lib.agentsJson` — backward-compat bridge producing legacy agents.json shape (temporary, will be removed)
- `packages.skills-runtime` — composable runtime with all skill dependencies
-- `devShells.default` — dev environment for working on skills
+- `devShells.default` — dev environment for working with skills
-**Mapping** (via home-manager):
+**Mapping** (via home-manager + m3ta-nixpkgs renderers):
+- `agents/` → rendered per-tool via `lib.agents.renderForTool` in m3ta-nixpkgs
- `skills/` → composed via `mkOpencodeSkills` (custom + external merged)
-- `context/`, `commands/`, `prompts/` → symlinks
-- `agents/agents.json` → embedded into config.json
-- Agent changes: require `home-manager switch`
-- Other changes: visible immediately
+- `context/`, `commands/` → symlinks
+- Agent changes via file-based agents: visible on next tool restart (no `home-manager switch` needed for prompt changes)
### External Skills (skills.sh)
@@ -142,13 +185,130 @@ xdg.configFile."opencode/skills".source =
};
```
+## Migration Guide (for the repo owner)
+
+This section documents how to complete the migration from the legacy `agents.json` + `prompts/*.txt` format to the canonical `agent.toml` + `system-prompt.md` format. The canonical files already exist; what remains is updating the consumer configs and removing legacy files.
+
+### Current state
+
+- ✅ All 6 agents exist in canonical format: `agents/{name}/agent.toml` + `agents/{name}/system-prompt.md`
+- ✅ `lib.loadAgents` loads canonical agents from TOML
+- ✅ `lib.agentsJson` backward-compat bridge produces the old JSON shape from TOML
+- ⏳ Legacy files still present: `agents/agents.json`, `prompts/*.txt`
+- ⏳ Consumer (home-manager) still reads `agents.json` directly via the old `coding.opencode` module
+
+### Step 1: Update home-manager config in your NixOS/HM flake
+
+Change from the old `coding.opencode` agent options to the new `coding.agents.opencode` module:
+
+```nix
+# BEFORE (legacy — agents embedded in config.json):
+coding.opencode = {
+ enable = true;
+ agentsInput = inputs.agents;
+ externalSkills = [ ... ];
+ ohMyOpencodeSettings = { ... };
+ extraSettings = { ... };
+};
+
+# AFTER (new — file-based agents from canonical TOML):
+coding.opencode = {
+ enable = true; # handles theme, plugins, formatter, oh-my-opencode
+ ohMyOpencodeSettings = { ... };
+ extraSettings = { ... };
+};
+
+coding.agents.opencode = {
+ enable = true;
+ agentsInput = inputs.agents;
+ externalSkills = [ ... ];
+ modelOverrides = {
+ chiron = "zai-coding-plan/glm-5";
+ "chiron-forge" = "zai-coding-plan/glm-5";
+ };
+};
+```
+
+Key changes:
+- `agentsInput` and `externalSkills` move from `coding.opencode` to `coding.agents.opencode`
+- `modelOverrides` is new — per-agent model selection (previously hardcoded in agents.json)
+- Skills, context, commands are now handled by the agents module
+- Agents are deployed as file-based `~/.config/opencode/agents/*.md` instead of embedded in config.json
+
+### Step 2: Run home-manager switch
+
+```bash
+home-manager switch --flake .
+```
+
+Verify that `~/.config/opencode/agents/` contains 6 `.md` files with the correct frontmatter.
+
+### Step 3: Remove legacy files from AGENTS repo
+
+After confirming everything works with the new setup:
+
+```bash
+cd /home/m3tam3re/p/AI/AGENTS
+
+# Remove legacy agent definition
+rm agents/agents.json
+
+# Remove legacy prompt files (now in agents/*/system-prompt.md)
+rm prompts/chiron.txt prompts/chiron-forge.txt prompts/hermes.txt \
+ prompts/athena.txt prompts/apollo.txt prompts/calliope.txt
+rmdir prompts/ # if empty
+
+# Remove backward-compat bridge from flake.nix
+# Delete the lib.agentsJson section from flake.nix
+```
+
+After removing `lib.agentsJson`, update flake.nix to remove the bridge function. The `lib.loadAgents` and `lib.mkOpencodeSkills` exports remain.
+
+### Step 4: Verify
+
+```bash
+# AGENTS repo: all TOML files parse
+cd /home/m3tam3re/p/AI/AGENTS
+for f in agents/*/agent.toml; do
+ nix eval --impure --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f"
+done
+nix flake check
+
+# nixpkgs: flake check passes
+cd /home/m3tam3re/p/NIX/nixpkgs
+nix flake check
+
+# Home-manager: agents deployed correctly
+ls ~/.config/opencode/agents/
+```
+
+### Optional: Enable other tool renderers
+
+To also deploy agents for Claude Code or Pi, add to your home-manager config:
+
+```nix
+# Claude Code agents
+coding.agents.claude-code = {
+ enable = true;
+ agentsInput = inputs.agents;
+ modelOverrides = { };
+};
+
+# Pi agents
+coding.agents.pi = {
+ enable = true;
+ agentsInput = inputs.agents;
+};
+```
+
## Rules System
-Centralized AI coding rules consumed via `mkOpencodeRules` from m3ta-nixpkgs:
+Centralized AI coding rules consumed via `mkCodingRules` from m3ta-nixpkgs
+(`mkOpencodeRules` still works as backward-compat alias):
```nix
# In project flake.nix
-m3taLib.opencode-rules.mkOpencodeRules {
+m3taLib.coding-rules.mkCodingRules {
inherit agents;
languages = [ "python" "typescript" ];
frameworks = [ "n8n" ];
diff --git a/agents/SCHEMA.md b/agents/SCHEMA.md
index 3e4aeeb..949b192 100644
--- a/agents/SCHEMA.md
+++ b/agents/SCHEMA.md
@@ -167,26 +167,26 @@ support, "~" means partial/mapped support, "–" means ignored.
| Field | OpenCode | Claude Code | Pi |
|-------|----------|-------------|----|
-| `name` | ✓ agent identifier | ✓ must be `[a-z0-9-]+` | in `AGENTS.md` |
-| `description` | ✓ agent picker | ✓ required | in `AGENTS.md` |
-| `display_name` | ✓ picker label | – ignored | – ignored |
+| `name` | ✓ agent identifier | ✓ must be `[a-z0-9-]+` | ✓ subagent frontmatter |
+| `description` | ✓ agent picker | ✓ required | ✓ subagent frontmatter |
+| `display_name` | ✓ picker label | – ignored | ✓ in AGENTS.md |
| `mode` | ✓ maps to `mode` | – all are subagents | primary only → `SYSTEM.md` |
| `tags` | ~ future use | – ignored | – ignored |
| `max_turns` | ✓ maps to `steps` | ✓ maps to `maxTurns` | – ignored |
-| `skills` | ✓ SKILL.md loaded | ✓ SKILL.md loaded | ✓ SKILL.md loaded |
+| `skills` | ✓ SKILL.md loaded | ✓ SKILL.md loaded | ✓ subagent `skill` field |
| `context` | ✓ injected | ✓ injected | ~ manual inclusion |
| `rules` | ✓ rule injection | ✓ rule injection | – ignored |
-| `permissions.bash` | ✓ rule DSL | ✓ bash tool perms | – no granularity |
-| `permissions.edit` | ✓ path rules | ✓ path rules | – no granularity |
-| `permissions.webfetch` | ✓ intent only | ✓ intent only | – ignored |
-| `permissions.websearch` | ✓ intent only | ✓ intent only | – ignored |
+| `permissions.bash` | ✓ rule DSL | ✓ bash tool perms | ~ tool enable/disable |
+| `permissions.edit` | ✓ path rules | ✓ path rules | ~ tool enable/disable |
+| `permissions.webfetch` | ✓ intent only | ✓ intent only | ~ tool enable/disable |
+| `permissions.websearch` | ✓ intent only | ✓ intent only | ~ tool enable/disable |
| `permissions.question` | ✓ intent only | – not a tool | – not a concept |
-| `permissions.external_directory` | ✓ path rules | – not supported | – not supported |
+| `permissions.external_directory` | ✓ path rules | – not supported | ~ tools list (allow/ask → include) |
**Renderer summary**:
- **OpenCode** — full support; most fields have direct mappings
- **Claude Code** — strong support; drops `display_name`, `external_directory`, `mode`
-- **Pi** — minimal support; reads `name`/`description` from `AGENTS.md`, skills via `SKILL.md`; permissions ignored
+- **Pi** — subagent support via `pi-subagents`; agent .md files with YAML frontmatter; permissions mapped to Pi tool list; skills via `SKILL.md`; AGENTS.md for discovery; SYSTEM.md for primary agent prompt
---