Skip to content

/ratio, jobs Edit selection, Slack/Discord fixes, startup and log changes - #54

Merged
robdevops merged 26 commits into
mainfrom
claude/kind-newton-ad0z2q
Oct 21, 2026
Merged

robdevops merged 26 commits into
mainfrom
claude/kind-newton-ad0z2q

Conversation

@robdevops

Copy link
Copy Markdown
Owner

What this PR holds

Every commit on the work branch since #52, grouped:

Commands and charts

  • /ratio [SYMBOL] [forward|current|peg] [top|bottom|negative|reverse] replaces /pe and /peg (both still work typed); .pe takes trailing/current.
  • A bar chart with a single bar is skipped: the report goes as text (period buttons kept).
  • Telegram keyboard: .pe and .jobs buttons, sorted.
  • Treemap Grouped by menu: the last button reads OK.

.jobs menu

  • Edit selects jobs (red) and changes nothing until OK; OK shows only when the selection differs from the jobs as they are; Delete only with a selection; Select all / Select none; Cancel; OK and Delete change a chat's jobs in one change.
  • Top level has no page buttons (what fits, and "…and N more"); Run becomes Run...

Slack

  • Manifest: --only, leaves out /who (and /help handling), docs on why both manifests must not be installed.
  • Log says why a press uploads its chart; the not-ready-yet retry is worded plainly.

Discord

  • A refused interaction's token stays out of the log; the endpoint check that passes is logged; a refused update is one warning line (body at debug).
  • An interaction webhook answering Unknown Webhook (10015) is retried after short waits.

Logging and docs

  • Startup logs networks: discord (push), slack (pull), …; the schedule line after a change reads schedule: <chat>: updated.
  • doc/classes.md, and doc updates for each change above.

Test plan

  • .venv/bin/python -m unittest discover -s tests -b (648 tests, offline)
  • CI on 3.x and 3.13.5, and the docker job

Generated by Claude Code

claude and others added 26 commits October 19, 2026 07:49
.pe [SYMBOL|top|bottom|negative] [trailing]: with trailing or current,
beside top, bottom or negative in either order, the list is by the
trailing P/E, of earnings reported, not the forward one.

- Command gets options, a second word read beside its keyword (Args.option),
  so ".pe bottom current" has both; suggest offers it.
- A trailing P/E is no analysts' estimate, so its list takes every stock
  and its chart's subtitle has the date alone; the forward P/E and the PEG
  still need min_analysts.
- Usage lines, doc/commands.md and util/record_outputs.py's list follow.

record_outputs: the usage text (.help, /start, .jobs add) and the two new
steps differ.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
.ratio [SYMBOL] [forward|current|peg] [top|bottom|negative|reverse]

- The forward P/E by default; current (or trailing) is the trailing P/E,
  peg the PEG. The end is top (by default), bottom or reverse (the
  highest first) or negative, in either order with the ratio.
- .pe, .forward pe, .fpe and .peg stay as names of it, .peg's the PEG, so
  typed commands and jobs stored under pe or peg run as before; .help,
  the slash command menus, the keyboard button and the Add menu list
  ratio alone.
- A forward P/E and a PEG still need min_analysts analysts; a trailing
  P/E, of earnings reported, takes every stock.
- Command.options (Args.option) is the second optional word that .pe
  trailing added; here it is the ratio, and the keyword the end.

record_outputs: the usage text (.help, /start, .jobs add, the Add menu)
and the three new .ratio steps differ; .pe and .peg runs are identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Slack refused the manifest ("The slash command has an invalid name") at
/help, one of its own commands. The manifest names every slash command of
.help but that one; .help and @FinBot help still answer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…ands

To find which slash command Slack refuses when it rejects a manifest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…s back

Slack refused the manifest at /who ("invalid name"), found with --only.
/help was never the problem, so the manifest names it again; .who SYMBOL
and @FinBot who SYMBOL still answer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
The text implied util/slack_manifest.py reads slackOutgoingWebhook, which
the tool never does (finbot.env is readable by root alone). It is the
tool's --url that picks push mode; finbot.env picks finbot's own side.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…retry plainly

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…ction; Run becomes Run...

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…ly when the selection differs; schedule log says '<chat>: updated'

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
… log says 'updated' once

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…r pull)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…ature warning explains Discord's deliberate bad probe

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…warning line, its body at debug

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…ts own

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…s before

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…s tried again after short waits

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…I controls apply

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
@robdevops
robdevops merged commit ac5ea8f into main Oct 21, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants