fix(cron): include model/provider in deploy comparison #577
Closed
Rockachopa
wants to merge 245 commits from
am/375-1776166469 into main
pull from: am/375-1776166469
merge into: Timmy_Foundation:main
Timmy_Foundation:main
Timmy_Foundation:fix/744-gateway-cron-notification-drop
Timmy_Foundation:fix/663
Timmy_Foundation:fix/670
Timmy_Foundation:fix/740
Timmy_Foundation:fix/741
Timmy_Foundation:fix/752
Timmy_Foundation:fix/753
Timmy_Foundation:fix/755
Timmy_Foundation:fix/754
Timmy_Foundation:fix/222
Timmy_Foundation:fix/746
Timmy_Foundation:fix/cron-delivery-retry-744
Timmy_Foundation:fix/743
Timmy_Foundation:fix/756
Timmy_Foundation:fix/747
Timmy_Foundation:fix/744
Timmy_Foundation:fix/705
Timmy_Foundation:fix/745
Timmy_Foundation:fix/668-api
Timmy_Foundation:fix/748
Timmy_Foundation:fix/749
Timmy_Foundation:fix/695
Timmy_Foundation:fix/725
Timmy_Foundation:fix/712
Timmy_Foundation:fix/669
Timmy_Foundation:fix/issue-734
Timmy_Foundation:fix/734
Timmy_Foundation:burn/714-1776218235
Timmy_Foundation:burn/713-1776218256
Timmy_Foundation:burn/714-1776218190
Timmy_Foundation:fix/693-crisis-notification-integration
Timmy_Foundation:fix/issue-642-1
Timmy_Foundation:fix/issue-702-7
Timmy_Foundation:fix/issue-701-8
Timmy_Foundation:fix/issue-692-3
Timmy_Foundation:fix/issue-706-6
Timmy_Foundation:fix/issue-694-1
Timmy_Foundation:fix/issue-645-6
Timmy_Foundation:fix/issue-707-5
Timmy_Foundation:fix/issue-708-4
Timmy_Foundation:fix/issue-643-8
Timmy_Foundation:fix/issue-711-3
Timmy_Foundation:fix/issue-714-1
Timmy_Foundation:fix/issue-713-2
Timmy_Foundation:fix/issue-644-7
Timmy_Foundation:fix/cron-schedule-parse-error
Timmy_Foundation:burn-681-1776207280
Timmy_Foundation:burn-677-1776207278
Timmy_Foundation:burn-679-1776207283
Timmy_Foundation:feat/670-approval-tiers
Timmy_Foundation:feat/679-crisis-wiring
Timmy_Foundation:feat/674-atlas-inference-engine
Timmy_Foundation:burn-677-1776207287
Timmy_Foundation:feat/atlas-provider
Timmy_Foundation:feat/671-hybrid-search
Timmy_Foundation:fix/677-crisis-hook
Timmy_Foundation:feat/673-988-crisis-escalation
Timmy_Foundation:feat/672-soul-crisis-protocol
Timmy_Foundation:burn-679-1776207276
Timmy_Foundation:fix/673-crisis-hook-integration
Timmy_Foundation:burn-681-1776207273
Timmy_Foundation:fix/677-crisis-hook-integration
Timmy_Foundation:fix/672-crisis-protocol
Timmy_Foundation:feat/681-path-aware-risk
Timmy_Foundation:feat/671-hybrid-search-router
Timmy_Foundation:feat/667-context-faithful-prompting
Timmy_Foundation:fix/670-approval-tiers
Timmy_Foundation:feat/672-crisis-protocol
Timmy_Foundation:feat/673-988-lifeline
Timmy_Foundation:burn/validate-action-pokayoke
Timmy_Foundation:fix/693-test-branch
Timmy_Foundation:perf/lazy-session-creation
Timmy_Foundation:fix/624-error-context
Timmy_Foundation:fix/626-validate-feedback
Timmy_Foundation:fix/614-multilingual-shield
Timmy_Foundation:claude/issue-628
Timmy_Foundation:claude/issue-613
Timmy_Foundation:dispatch/350-1776180746
Timmy_Foundation:dispatch/295-1776180746
Timmy_Foundation:dispatch/329-1776180746
Timmy_Foundation:dispatch/372-1776180746
Timmy_Foundation:dispatch/327-1776180746
Timmy_Foundation:dispatch/326-1776180746
Timmy_Foundation:dispatch/296-1776180746
Timmy_Foundation:dispatch/375-1776180746
Timmy_Foundation:dispatch/321-1776180746
Timmy_Foundation:dispatch/324-1776180746
Timmy_Foundation:claude/issue-592
Timmy_Foundation:fix/582-shield-tool-args
Timmy_Foundation:claude/issue-579
Timmy_Foundation:am/350-1776166469
Timmy_Foundation:am/326-1776166469
Timmy_Foundation:am/329-1776166469
Timmy_Foundation:am/295-1776166469
Timmy_Foundation:am/322-1776166469
Timmy_Foundation:am/327-1776166469
Timmy_Foundation:am/378-1776166469
Timmy_Foundation:am/372-1776166469
Timmy_Foundation:am/288-1776166469
Timmy_Foundation:am/296-1776166469
Timmy_Foundation:am/321-1776166469
Timmy_Foundation:am/324-1776166469
Timmy_Foundation:claude/issue-565
Timmy_Foundation:dawn/295-1776130053
Timmy_Foundation:triage/295-1776129677
Timmy_Foundation:claude/issue-556
Timmy_Foundation:q/295-1776129480
Timmy_Foundation:dawn/326-1776130053
Timmy_Foundation:fix/538-context-pressure-threshold
Timmy_Foundation:fix/561-ssh-dispatch
Timmy_Foundation:dawn/322-1776130053
Timmy_Foundation:dawn/372-1776130053
Timmy_Foundation:triage/326-1776129677
Timmy_Foundation:dawn/350-1776130053
Timmy_Foundation:dawn/378-1776130053
Timmy_Foundation:dawn/329-1776130053
Timmy_Foundation:triage/322-1776129677
Timmy_Foundation:triage/372-1776129677
Timmy_Foundation:dawn/327-1776130053
Timmy_Foundation:feat/505-session-templates
Timmy_Foundation:triage/378-1776129677
Timmy_Foundation:triage/350-1776129677
Timmy_Foundation:q/372-1776129480
Timmy_Foundation:triage/329-1776129677
Timmy_Foundation:triage/327-1776129677
Timmy_Foundation:q/322-1776129480
Timmy_Foundation:q/378-1776129480
Timmy_Foundation:dawn/296-1776130053
Timmy_Foundation:fix/500-cloud-context-warning
Timmy_Foundation:queue/372-1776129201
Timmy_Foundation:dawn/324-1776130053
Timmy_Foundation:q/327-1776129480
Timmy_Foundation:q/329-1776129480
Timmy_Foundation:queue/378-1776129201
Timmy_Foundation:dawn/288-1776130053
Timmy_Foundation:q/350-1776129480
Timmy_Foundation:triage/296-1776129677
Timmy_Foundation:triage/324-1776129677
Timmy_Foundation:fix/499-hardcoded-paths
Timmy_Foundation:q/324-1776129480
Timmy_Foundation:q/296-1776129480
Timmy_Foundation:queue/322-1776129201
Timmy_Foundation:queue/327-1776129201
Timmy_Foundation:queue/324-1776129201
Timmy_Foundation:q/326-1776129480
Timmy_Foundation:queue/296-1776129201
Timmy_Foundation:queue/350-1776129201
Timmy_Foundation:fix/478-tilde-expand
Timmy_Foundation:fix/478-tilde-expansion
Timmy_Foundation:queue/329-1776129201
Timmy_Foundation:fix/478-hermes-home-tilde-expand
Timmy_Foundation:fix/468-cron-cloud-context
Timmy_Foundation:fix/479-optional-skills-hardcoded-paths
Timmy_Foundation:fix/479-hardcoded-paths
Timmy_Foundation:q/316-1776129677
Timmy_Foundation:q/288-1776129480
Timmy_Foundation:feat/334-profile-scoped-cron
Timmy_Foundation:whip/326-1776128804
Timmy_Foundation:dawn/375-1776130053
Timmy_Foundation:fix/375-deploy-crons-model-provider-comparison
Timmy_Foundation:whip/324-1776128804
Timmy_Foundation:burn/456-1776129600
Timmy_Foundation:triage/375-1776129677
Timmy_Foundation:fix/468-1776128804
Timmy_Foundation:q/375-1776129480
Timmy_Foundation:whip/372-1776128804
Timmy_Foundation:queue/375-1776129201
Timmy_Foundation:queue/288-1776129201
Timmy_Foundation:fix/457-ssh-dispatch-validation
Timmy_Foundation:whip/350-1776128804
Timmy_Foundation:whip/251-1776128804
Timmy_Foundation:fix/456-cloud-context-warning
Timmy_Foundation:queue/321-1776129201
Timmy_Foundation:whip/378-1776128804
Timmy_Foundation:whip/322-1776128804
Timmy_Foundation:whip/327-1776128804
Timmy_Foundation:whip/329-1776128804
Timmy_Foundation:whip/288-1776128804
Timmy_Foundation:whip/327-1776127281
Timmy_Foundation:whip/375-1776128804
Timmy_Foundation:whip/321-1776128804
Timmy_Foundation:dispatch/288-1776180746
Timmy_Foundation:triage/288-1776129677
Timmy_Foundation:whip/296-1776128804
Timmy_Foundation:whip/293-1776127532
Timmy_Foundation:whip/350-1776127532
Timmy_Foundation:whip/372-1776127532
Timmy_Foundation:whip/378-1776127532
Timmy_Foundation:whip/329-1776127532
Timmy_Foundation:whip/322-1776127532
Timmy_Foundation:whip/316-1776127532
Timmy_Foundation:whip/321-1776127532
Timmy_Foundation:whip/326-1776127532
Timmy_Foundation:whip/327-1776127532
Timmy_Foundation:whip/314-1776127532
Timmy_Foundation:whip/288-1776127532
Timmy_Foundation:whip/375-1776127532
Timmy_Foundation:burn/274-1776126523
Timmy_Foundation:burn/275-1776126523
Timmy_Foundation:burn/293-1776126523
Timmy_Foundation:burn/273-1776126523
Timmy_Foundation:burn/299-1776126523
Timmy_Foundation:burn/272-1776126523
Timmy_Foundation:burn/350-1776125702
Timmy_Foundation:burn/372-1776125702
Timmy_Foundation:burn/329-1776125702
Timmy_Foundation:burn/328-1776125702
Timmy_Foundation:burn/379-1776125702
Timmy_Foundation:burn/327-1776125702
Timmy_Foundation:burn/317-1776125702
Timmy_Foundation:burn/373-1776125702
Timmy_Foundation:burn/349-1776125702
Timmy_Foundation:burn/326-1776125702
Timmy_Foundation:burn/322-1776125702
Timmy_Foundation:queue/326-1776129201
Timmy_Foundation:burn/350-1776120221
Timmy_Foundation:burn/372-1776120221
Timmy_Foundation:burn/324-1776120221
Timmy_Foundation:burn/328-1776120221
Timmy_Foundation:burn/373-1776120221
Timmy_Foundation:burn/329-1776120221
Timmy_Foundation:burn/349-1776120221
Timmy_Foundation:burn/323-1776120221
Timmy_Foundation:burn/322-1776120221
Timmy_Foundation:burn/326-1776120221
Timmy_Foundation:burn/327-1776120221
Timmy_Foundation:burn/317-1776120221
Timmy_Foundation:burn/320-1776120221
Timmy_Foundation:burn/251-1776117799
Timmy_Foundation:burn/378-1776117791
Timmy_Foundation:burn/375-1776117778
Timmy_Foundation:burn/379-1776117790
Timmy_Foundation:burn/376-1776117777
Timmy_Foundation:burn/349-1776117786
Timmy_Foundation:burn/254-1776117794
Timmy_Foundation:burn/350-1776117787
Timmy_Foundation:burn/252-1776117800
Timmy_Foundation:burn/262-1776117798
Timmy_Foundation:burn/372-1776117789
Timmy_Foundation:burn/282-1776117784
Timmy_Foundation:burn/284-1776117781
Timmy_Foundation:burn/373-1776117779
Timmy_Foundation:burn/285-1776117782
Timmy_Foundation:burn/377-1776117775
Timmy_Foundation:burn/280-1776117796
Timmy_Foundation:burn/acp-272-1776117838
Timmy_Foundation:burn/255-1776117795
Timmy_Foundation:burn/286-1776117783
Timmy_Foundation:burn/web-console-325
Timmy_Foundation:burn/253-1776117793
Timmy_Foundation:burn/321-1776120221
Timmy_Foundation:burn/321-1776125702
Timmy_Foundation:burn/profile-cron-334
Timmy_Foundation:burn/prompt-injection-324
Timmy_Foundation:burn/skill-revert-295
Timmy_Foundation:burn/context-overflow-296
Timmy_Foundation:burn/honcho-eval-322
Timmy_Foundation:burn/privacy-filter-283
Timmy_Foundation:burn/model-benchmark-287
Timmy_Foundation:burn/20260413-1705-fix-token-tracking
Timmy_Foundation:feat/marathon-session-limits-326
Timmy_Foundation:fix/poka-yoke-hardcoded-paths
Timmy_Foundation:feat/315-session-gc
Timmy_Foundation:feature/time-aware-model-routing-317
Timmy_Foundation:fix/gateway-config-debt-328
Timmy_Foundation:feat/lazy-session-creation
Timmy_Foundation:burn/378-1776120221
Timmy_Foundation:fix/weak-credential-guard
Timmy_Foundation:fix/tool-return-type-validation
Timmy_Foundation:fix/memory-no-match-not-error
Timmy_Foundation:feat/temporal-decay-holographic-memory
Timmy_Foundation:fix/syntax-preflight-execute-code
Timmy_Foundation:fix/cron-script-failure-detection
Timmy_Foundation:fix/empty-model-preflight
Timmy_Foundation:fix/cron-sync-guard-v2
Timmy_Foundation:fix/cron-interpreter-shutdown-352
Timmy_Foundation:feat/error-circuit-breaker
Timmy_Foundation:fix/circuit-breaker-error-cascade
Timmy_Foundation:feat/cron-run-now
Timmy_Foundation:ci/fix-mempalace-syntax
Timmy_Foundation:claude/issue-351
Timmy_Foundation:fix/cron-tick-backlog
Timmy_Foundation:feat/deploy-sync-guard
Timmy_Foundation:feat/20260413-cron-agent-kwargs
Timmy_Foundation:feat/profile-scoped-cron
Timmy_Foundation:fix/cron-ticker-startup
Timmy_Foundation:fix/empirical-audit-hardening
Timmy_Foundation:feat/skills-index-workflow
Timmy_Foundation:fix/credential-guard
Timmy_Foundation:feat/research-paper-scaffolder
Timmy_Foundation:feat/cron-tool-choice-propagation
Timmy_Foundation:perplexity/provider-allowlist
Timmy_Foundation:fix/json-repair-for-tool-calls
Timmy_Foundation:feat/context-rag-decision-framework
Timmy_Foundation:census/feature-inventory
Timmy_Foundation:fix/ci-stability
Timmy_Foundation:burn/20260410-1649-277-memory-remove-bridge
Timmy_Foundation:keymaxx/mimoomni/243
Timmy_Foundation:burn/20260410-0744-matrix-wire
Timmy_Foundation:burn/20260410-0707-browser-integration
Timmy_Foundation:feature/improve-sovereignty-justification
Timmy_Foundation:burn/20260409-2111-memory-budget
Timmy_Foundation:burn/20260409-2105-memory-sovereignty
Timmy_Foundation:burn/20260409-2051-263-memory-architecture-guide
Timmy_Foundation:burn/20260409-1242-memory-docs
Timmy_Foundation:claude/issue-1135
Timmy_Foundation:feat/mempalace-portal-1775695506634
Timmy_Foundation:feat/ci-no-duplicate-models
Timmy_Foundation:feat/mempalace-tool-1775642243437
Timmy_Foundation:bezalel/ci-provider-duplicate-check
Timmy_Foundation:bezalel/self-awareness-epic-203
Timmy_Foundation:fix/kimi-fallback-model
Timmy_Foundation:bezalel/pr-215-rescue
Timmy_Foundation:perplexity/mempalace-tests
Timmy_Foundation:upstream-sync
Timmy_Foundation:bezalel/fix-gitea-ci-runner-host-mode
Timmy_Foundation:claude/issue-192
Timmy_Foundation:claude/issue-190
Timmy_Foundation:bezalel/fix-indentation-error
Timmy_Foundation:bezalel/gitea-workflow-skill
Timmy_Foundation:rescue/ollama-provider
Timmy_Foundation:rescue/v011-obfuscation-fix
Timmy_Foundation:claw-code/issue-151
Timmy_Foundation:claw-code/issue-126
Timmy_Foundation:groq/issue-168
Timmy_Foundation:timmy/issue-169-ollama-provider
Timmy_Foundation:gemini/issue-24
Timmy_Foundation:bezalel/syntax-guard-ci
Timmy_Foundation:claude/issue-128
Timmy_Foundation:claude/issue-142
Timmy_Foundation:claude/issue-133
Timmy_Foundation:claude/issue-143
Timmy_Foundation:claude/issue-146
Timmy_Foundation:claude/issue-155
Timmy_Foundation:claude/issue-147
Timmy_Foundation:claude/issue-148
Timmy_Foundation:bezalel/notebook-workflow-demo
Timmy_Foundation:claude/issue-149
Timmy_Foundation:bezalel/forge-health-check
Timmy_Foundation:epic-999-phase-ii-forge
Timmy_Foundation:allegro/m1-stop-protocol
Timmy_Foundation:timmy/issue-123-process-resilience
Timmy_Foundation:timmy/issue-116-config-validation
Timmy_Foundation:epic-999-phase-i
Timmy_Foundation:security/v-011-skills-guard-bypass
Timmy_Foundation:gemini/security-hardening
Timmy_Foundation:gemini/sovereign-gitea-client
Timmy_Foundation:timmy-custom
Timmy_Foundation:security/fix-oauth-session-fixation
Timmy_Foundation:security/fix-skills-path-traversal
Timmy_Foundation:security/fix-file-toctou
Timmy_Foundation:security/fix-error-disclosure
Timmy_Foundation:security/add-rate-limiting
Timmy_Foundation:security/fix-browser-cdp
Timmy_Foundation:security/fix-docker-privilege
Timmy_Foundation:security/fix-auth-bypass
Timmy_Foundation:fix/sqlite-contention
Timmy_Foundation:tests/security-coverage
Timmy_Foundation:security/fix-race-condition
Timmy_Foundation:security/fix-ssrf
Timmy_Foundation:security/fix-secret-leakage
Timmy_Foundation:feat/gen-ai-evolution-phases-19-21
Timmy_Foundation:feat/gen-ai-evolution-phases-16-18
Timmy_Foundation:feat/gen-ai-evolution-phases-13-15
Timmy_Foundation:security/fix-path-traversal
Timmy_Foundation:security/fix-command-injection
Timmy_Foundation:feat/gen-ai-evolution-phases-10-12
Timmy_Foundation:feat/gen-ai-evolution-phases-7-9
Timmy_Foundation:feat/gen-ai-evolution-phases-4-6
Timmy_Foundation:feat/gen-ai-evolution-phases-1-3
Timmy_Foundation:feat/sovereign-evolution-redistribution
Timmy_Foundation:feat/apparatus-verification
Timmy_Foundation:feat/sovereign-intersymbolic-ai
Timmy_Foundation:feat/sovereign-learning-system
Timmy_Foundation:feat/sovereign-reasoning-engine
Labels
Clear labels
CI
QA
assigned-claw-code
assigned-kimi
audit-finding
batch-pipeline
blocked
bug
claw-code-done
claw-code-in-progress
critical
duplicate
epic
epic:memory
gaming
infra
kimi-done
kimi-in-progress
mcp
morrowind
needs-review
ops
p0-critical
p1-important
phase:1-activate
phase:2-operational
phase:3-episodic
phase:4-hygiene
phase:5-integration
poka-yoke
research
security
shared-infra
stale
throughput-10x
token-masterplan
tool-evaluation
velocity-engine
wont-fix
Continuous integration, runners, workflow issues
Quality assurance, testing, production audit
Queued for Code Claw (qwen/openrouter)
Task assigned to KimiClaw for processing
batch-pipeline label
Blocked by external dependency or merge conflict
Code Claw completed this task
Code Claw is actively working
Duplicate of another issue
Epic - large feature with multiple sub-tasks
Unified Memory Architecture epic
Gaming agent capabilities
Infrastructure, VPS, DNS, deployment
KimiClaw has completed this task
KimiClaw is actively working on this
MCP (Model Context Protocol) tools & servers
Morrowind Agent gameplay & MCP integration
PR or issue requires reviewer sign-off before merge/close
Phase 1: Activate existing systems
Phase 2: Operational memory bridge
Phase 3: Proactive episodic recall
Phase 4: Memory hygiene and quality
Phase 5: Integration and testing
Security hardening, vulnerability fixes
Shared infrastructure across projects (Playground + LPM)
No activity, pending triage or closure
throughput-10x label
token-masterplan label
Auto-generated by velocity engine
Closed as intentionally not fixing — explicit descope
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
Rockachopa
Timmy
allegro
antigravity
bezalel
claude
claw-code
codex-agent
ezra
gemini
google
grok
hermes
kimi
manus
perplexity
sonnet
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Timmy_Foundation/hermes-agent#577
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "am/375-1776166469"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #375
_jobs_changed()now compares 4 fields: prompt, schedule, model, provider.Model/provider-only YAML changes are no longer silently dropped.
Review: Include model/provider in deploy comparison (#375)
This PR rewrites
deploy-crons.pyto add YAML-based deployment (--deploy) alongside the existing normalization (--normalize), and fixes the core bug where_jobs_changed()only compared prompt and schedule, silently dropping model/provider changes.Looks good:
_jobs_changed()now compares 4 fields (prompt, schedule, model, provider) using_flat_model()and_flat_provider()helpers to normalize dict vs string model representations--deploy/--normalizemutual exclusion viaadd_mutually_exclusive_groupis cleannormalize_job()is simplified without losing functionalityIssues requiring changes:
1. Job matching key is fragile and will break on model/provider changes
The index key is
f"{prompt}||{json.dumps(schedule, sort_keys=True)}". This means if a user changes only the model or provider in the YAML, the key still matches the existing job (same prompt + schedule), so it correctly triggers an update. Good. BUT if the user changes the prompt, the key won't match, so a new job is created instead of updating the existing one — leaving the old job orphaned. There's no mechanism to match by job name or ID, which would be more robust.2.
_parse_schedulefallback is incompleteThe fallback parser (when
cron.jobs.parse_schedulecan't be imported) only handlesevery Xm/Xh/Xdpatterns. Standard cron expressions like0 9 * * 1-5would fall through to the else branch and be returned as{"kind": "cron", "expr": schedule}. This may not match the format produced by the realparse_schedule, causing key mismatches and duplicate job creation.3. New jobs are created with
created_at: NoneWhen creating a new job,
"created_at": Noneis hardcoded. This should be set to the current timestamp (datetime.now().isoformat()or similar).4. No tests
This is a complete rewrite of the deploy script with new deployment logic. There should be tests for:
_jobs_changed()with various field change combinations_flat_model()/_flat_provider()with dict and string model formatsnormalize_job()edge cases5. Lost error handling from the original
The original
normalize_jobs_filehadtry/except json.JSONDecodeErroraround JSON loading. The rewrite just callsjson.load(f)without catching parse errors, which would produce an unhelpful traceback for corrupted files.6. Readability regression
The original code had clear variable names and comments. The rewrite uses very compressed style (
om,op,n,a,g,p). For a deployment tool that people run in production, readability matters.Review: PR #577 — fix(cron): include model/provider in deploy comparison
This PR rewrites
deploy-crons.pysubstantially — adding YAML-based deployment mode and fixing_jobs_changed()to compare model/provider fields in addition to prompt and schedule.Issues:
deploy-crons.py(154 lines removed, 174 added). The core fix is just the_jobs_changed()function. This level of rewrite carries merge-conflict risk and makes review harder._flat_model/_flat_providerhelpers are a good abstraction for handling the dict-or-string model field._parse_schedulefallback has a simplistic parser (int(dur[:-1])) that will throwValueErroron unexpected input likeevery 1.5horevery foo. Needs error handling.HAS_YAMLimport guard is good, but the deploy path silently fails if YAML is not installed — should this be a hard dependency for deploy mode?_jobs_changed()comparison logic.The fix for #375 (model/provider comparison) is correct and needed, but the scope creep from a 4-field comparison fix to a full rewrite of the deploy script is concerning.
Duplicate PR — This is an older version. The latest iteration is PR #607. Please close this PR and consolidate work there.
This version includes model/provider in deploy comparison but #607 adds improved deploy-sync guard validation with more comprehensive kwarg checking and better error messages.
Archived after upstream sync to NousResearch/hermes-agent.
Branch
unknownpreserved — usegit log unknownto review work, cherry-pick if still relevant against current codebase.Pull request closed