Skip to content

Import YAAS v2 snapshot - #4

Closed
guangmian-circle wants to merge 1 commit into
masterfrom
publish/yaas-v2-20260812-043520
Closed

guangmian-circle wants to merge 1 commit into
masterfrom
publish/yaas-v2-20260812-043520

Conversation

@guangmian-circle

Copy link
Copy Markdown
Collaborator

Initial import of Yourself-as-a-Service v2 into this repository. master currently holds only a README, so this is the first content PR.

What this is. A personal Slack assistant that runs on a ~60-second launchd loop and only spends model tokens when something it watches actually moves. A Python orchestrator (tick.py) evaluates per-quest watches through a directory of single-purpose checkers, and dispatches a worker only on real activity. README.md and ARCHITECTURE.md are the entry points.

How it was built.

  • One-commit snapshot of the local .git-yaas-v2 main branch. Full development history stays local and was not rewritten.
  • Source commit: 92654cfb03e0bf2a236d2d14392d2ad943feed97
  • The scan.yml workflow branch filters were retargeted from main to master in this delivery commit only, to match this repository's default branch. No other file differs from the source tree.
  • Local uncommitted and untracked files were excluded. This is the committed tree exactly as it stands at the source commit.

Screening done before push. No submodules, no files over 200 KB, no binary blobs, and no credentials: the only matches for token-shaped patterns are macOS Keychain service names (slack-xoxp-token) and one obviously fake token in a unit test. Secrets are read from the Keychain and from a gitignored .env; .env.example carries placeholders only.

The commit is SSH-signed and GitHub reports the signature verified.

Yourself-as-a-Service v2: a personal Slack assistant that runs on a ~60-second
launchd loop and only spends model tokens when something it watches actually
moves. A Python orchestrator (tick.py) evaluates per-quest watches through a
directory of single-purpose checkers, and dispatches a worker only on real
activity.

One-commit snapshot of the local .git-yaas-v2 main branch. Full development
history stays local; nothing is rewritten there.

Source commit: 92654cfb03e0bf2a236d2d14392d2ad943feed97

The scan.yml workflow branch filters were retargeted from `main` to `master` in
this delivery commit only, to match this repository's default branch.

Local uncommitted and untracked files were excluded; this is the committed tree
exactly as it stands at the source commit.
@github-actions

Copy link
Copy Markdown

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 2 package(s) with unknown licenses.
See the Details below.

License Issues

.github/workflows/scan.yml

PackageVersionLicenseIssue Type
circlefin/circle-public-github-workflows/.github/workflows/attach-release-assets.yaml1.*.*NullUnknown License
circlefin/circle-public-github-workflows/.github/workflows/pr-scan.yaml1.*.*NullUnknown License
Allowed Licenses: BSD-1-Clause, BSD-2-Clause, BSD-3-Clause, MIT, MIT-0, Apache-1.1, Apache-2.0, Artistic-1.0, Artistic-2.0, PHP-3.0, PHP-3.01, PSF-2.0, Zlib, zlib-acknowledgement, BSL-1.0, OpenSSL, WTFPL, CC0-1.0, CC-PDDC, CC-BY-1.0, CC-BY-2.0, CC-BY-2.5, CC-BY-3.0, CC-BY-4.0, Unlicense, ISC, BlueOak-1.0.0, BSD-2-Clause-Patent, ADSL, Apache-2.0, APAFML, BSD-1-Clause, BSD-2-Clause, BSD-2-Clause-FreeBSD, BSD-2-Clause-NetBSD, BSD-2-Clause-Views, BSL-1.0, DSDP, ECL-1.0, ECL-2.0, ImageMagick, ISC, Linux-OpenIB, MIT, MIT-Modern-Variant, MS-PL, MulanPSL-1.0, Mup, PostgreSQL, Spencer-99, UPL-1.0, Xerox, 0BSD, AFL-1.1, AFL-1.2, AFL-2.0, AFL-2.1, AFL-3.0, AMDPLPA, AML, AMPAS, ANTLR-PD, ANTLR-PD-fallback, Apache-1.0, Apache-1.1, Artistic-2.0, Bahyph, Barr, BSD-3-Clause, BSD-3-Clause-Attribution, BSD-3-Clause-Clear, BSD-3-Clause-LBNL, BSD-3-Clause-Modification, BSD-3-Clause-No-Nuclear-License-2014, BSD-3-Clause-No-Nuclear-Warranty, BSD-3-Clause-Open-MPI, BSD-4-Clause, BSD-4-Clause-Shortened, BSD-4-Clause-UC, BSD-Source-Code, bzip2-1.0.5, bzip2-1.0.6, CC0-1.0, CNRI-Jython, CNRI-Python, CNRI-Python-GPL-Compatible, Cube, curl, eGenix, Entessa, FTL, HTMLTIDY, IBM-pibs, ICU, Info-ZIP, Intel, JasPer-2.0, Libpng, libpng-2.0, libtiff, LPPL-1.3c, MIT-0, MIT-advertising, MIT-open-group, MIT-CMU, MIT-enna, MIT-feh, MITNFA, MTLL, MulanPSL-2.0, Multics, Naumen, NCSA, Net-SNMP, NetCDF, NTP, OLDAP-2.0, OLDAP-2.0.1, OLDAP-2.1, OLDAP-2.2, OLDAP-2.2.1, OLDAP-2.2.2, OLDAP-2.3, OLDAP-2.4, OLDAP-2.5, OLDAP-2.6, OLDAP-2.7, OLDAP-2.8, OML, OpenSSL, PHP-3.0, PHP-3.01, Plexus, PSF-2.0, Python-2.0, Ruby, Saxpath, SGI-B-2.0, SMLNJ, SWL, TCL, TCP-wrappers, Unicode-DFS-2015, Unicode-DFS-2016, Unlicense, VSL-1.0, W3C, X11, XFree86-1.1, Xnet, xpp, Zlib, zlib-acknowledgement, ZPL-2.0, ZPL-2.1, AAL, Adobe-2006, Afmparse, Artistic-1.0, Artistic-1.0-cl8, Artistic-1.0-Perl, Beerware, blessing, Borceux, CECILL-B, ClArtistic, Condor-1.1, Crossword, CrystalStacker, diffmark, DOC, EFL-1.0, EFL-2.0, Fair, FSFUL, FSFULLR, Giftware, HPND, IJG, Leptonica, LPL-1.0, LPL-1.02, MirOS, mpich2, NASA-1.3, NBPL-1.0, Newsletr, NLPL, NRL, OGTSL, OLDAP-1.1, OLDAP-1.2, OLDAP-1.3, OLDAP-1.4, psutils, Qhull, Rdisc, RSA-MD, Spencer-86, Spencer-94, TU-Berlin-1.0, TU-Berlin-2.0, Vim, W3C-19980720, W3C-20150513, Wsuipa, WTFPL, xinetd, Zed, Zend-2.0, ZPL-1.1, GPL-2.0, GPL-2.0+, GPL-2.0-or-later, GPL-3.0, GPL-3.0+, GPL-3.0-or-later, LGPL-2.1, LGPL-2.1+, LGPL-2.1-or-later, LGPL-3.0, LGPL-3.0+, LGPL-3.0-or-later, MPL-1.1, MPL-2.0, MPL-2.0-no-copyleft-exception, CDDL-1.0, CDDL-1.1, CPL-1.0, IPL-1.0, EPL-1.0, EPL-2.0, Apache-1.0, CC-BY-SA-1.0, CC-BY-SA-2.0
Excluded from license check:

OpenSSF Scorecard

PackageVersionScoreDetails
actions/circlefin/circle-public-github-workflows/.github/workflows/attach-release-assets.yaml 1.*.* UnknownUnknown
actions/circlefin/circle-public-github-workflows/.github/workflows/pr-scan.yaml 1.*.* UnknownUnknown

Scanned Files

  • .github/workflows/scan.yml

@guangmian-circle

Copy link
Copy Markdown
Collaborator Author

Closing as redundant: this duplicated the open publication PR #1. The same snapshot has been pushed onto #1's branch instead.

@guangmian-circle
guangmian-circle deleted the publish/yaas-v2-20260812-043520 branch August 12, 2026 04:39
nexx88 added a commit that referenced this pull request Aug 17, 2026
…arser) (#6)

## Summary

Fixes the 5 items surfaced by a whole-codebase security audit of
`yaas-triage`. The audit found **no high-confidence (>=8) exploitable
vulnerabilities**; these are the defense-in-depth / correctness
hardening items below the exploitable bar. Each is a small, surgical
change with tests kept green.

| # | Fix | File |
|---|-----|------|
| 1 | Reject path traversal from an unvalidated `watch.json` `type`
before it builds/execs the checker path (`[a-z0-9_]+` gate → misconfig
verdict otherwise) | `tick.py` |
| 2 | Apply the `log-event.py` quest_id traversal guard to
`slack-send.py` so both send paths validate identically |
`surfaces/slack-send.py` |
| 3 | Drop `pending_review -> start` so the human-approval gate is
structural, not dependent on the checker | `approval_state.py` |
| 4 | Enforce header/TS adjacency in the Slack message parser (removes
orphan/lone-TS mis-count) | `checkers/slack_utils.py` |
| 5 | Remove dead `_find_watch_json` (unvalidated-path helper,
unreferenced) | `ledger/approval-helper.py` |

## Known residual (finding #4)

The Slack MCP returns messages as one flattened, unescaped **text**
blob, so a body that forges an *adjacent* `=== header ===` + `Message
TS:` pair remains indistinguishable from a real message boundary. The
parser change enforces the format contract and closes the orphan/lone-TS
path, but full closure needs structured (per-message) MCP output —
documented inline with a `ponytail:` note. Impact is now further blunted
by #3 (dispatch requires a structural review gate).

## Test plan

- [x] 44/44 real suites pass; differential `tick.py` vs goldens **29/0**
(no golden edits)
- [x] `slack_utils`, all `approval-*`, `watch-guard`, `log-event`,
`slack-send` suites green
- [x] Functional: `slack-send.py --quest-id ../../etc` → `invalid quest
id` exit 1; real ids pass through
- [x] Functional: `wtype` guard accepts every real watch type, rejects
traversal/dotted/empty
- [x] Syntax + import checks on all 5 edited modules

(The one full-suite failure, `path-references.test.sh`, is entirely a
local gitignored `.ua/` plugin cache — 0 non-`.ua` refs — not code and
not from this branch.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Guangmian Kung <guangmian.kung@circle.com>
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.

1 participant