Software for Court Appointed Special Advocates

๐Ÿšฒ @goldlindastein โœจ @rubyforgood ๐Ÿ’Ž

linda@rubyforgood.org โœจ casa@rubyforgood.org

Join us on slack! rubyforgood.herokuapp.com

๐Ÿ“š whoami ๐Ÿšฒ

  • (2010..Time.now) dev: ThoughtWorks -> Braintree -> Breadcrumb (Groupon) -> ThoughtWorks -> Square -> Sempre Health -> Parachute Health
  • Healthtech
  • ๐Ÿช‚ Parachute Health ๐Ÿช‚ better ordering for Durable Medical Equipment (we are hiring)
  • A lead of the Ruby for Good CASA project 2019 - ๐Ÿš€๏ธ

Fast Definitions

โš–๏ธ CASA is a nonprofit which trains volunteers to help foster youth

โœจ

๐Ÿ’Žโค๏ธ Ruby for Good๏ธ is a nonprofit which builds software for other nonprofits (mostly in ruby)

โœจ

The Ruby for Good CASA project โœจ๐Ÿ›  is software written by Ruby for Good to help CASA

This talk is about

โœจ https://github.com/rubyforgood/casa โœจ

creating

an ecosystem

for writing OSS

SaaS OSS

serving volunteers

who serve foster youth

Foster youth?

raise your hand if

raise your hand if

you have ever thought about the USA foster care system

(USA specific) foster system

~50 years ago

"Every child placed in foster care must have court oversight to ensure that both the childโ€™s and the parentsโ€™ legal rights are protected until the child reaches a safe, permanent home"

"The first CASA Program was founded in 1977 by Judge David Soukup, a Juvenile Court judge in Seattle, Washington who felt that he was making critical decisions about childrenโ€™s lives without adequate information. He began recruiting volunteers from the community to work one-on-one with children in foster care. The volunteer advocate, or โ€œCASA,โ€ is appointed by a juvenile court judge to a child in foster care. The CASA then gets to know their assigned child, gathers information from everyone in the childโ€™s life (including the childโ€™s biological parents, foster parents, medical and mental health professionals, social workers, therapists, teachers, and attorneys) and prepares a written report giving the judge in the childโ€™s court case detailed information about the situation and the childโ€™s needs."

The CASA organization

  • nationalcasagal.org
  • 93k+ volunteers, 900+ independent regions, 49 states + DC (no North Dakota)
  • 30hr+ training + continuing education
  • ๐Ÿง‘๐Ÿฝโ€โš–๏ธ Sworn in by judge for ~2yr minimum
  • 1๏ธโƒฃ Assigned to one youth
  • Gather information
  • ๐Ÿ“ Court Report / ~6mo
  • wiki/Court_Appointed_Special_Advocates

CASA Funding ๐Ÿ’ต ๐Ÿ“Š

"CASA [of Southwest Missouri] relies on a diverse revenue base, foundations and the United Way, individual and corporate contributions, public grants"
casaswmo.org/who-we-are/frequent-questions

"The DFA awards two types of CASA grants (...) To be eligible to receive a CASA Grant, an applicant must-"
courts.state.md.us/.../casaspecialconditions.pdf

"In California, most CASA programs are non-profit organizations and receive funding from a variety of other sources."
courts.ca.gov/documents/CASA.pdf

Existing processes

  • CASA volunteer talks to people biological parents, foster parents, medical and mental health professionals, social workers, therapists, teachers, attorneys
  • Take notes
  • Don't forget any involved parties! ๐Ÿค”
  • ๐Ÿ“ Court Report .docx / 6 months
  • โ€๐Ÿ’ผ Supervisor of volunteers helps!
  • ๐Ÿš˜ Mileage reimbursement
  • ๐Ÿ“– Ongoing training
  • ๐Ÿ’ฐ Grant proposal evidence

Prior art ๐ŸŽจ

  1. SimplyOptima
  2. CasaManager
  3. Salesforce.org (nonprofit)
  4. Paper forms hand-delivered to CASA regional office
  5. Personal email
  6. SMS text message
  7. Fax

Volunteer retention

  1. โœจ volunteer - supervisor communication 1๏ธโƒฃ
  2. ๐Ÿ“ž Volunteer - Supervisor Communication 2๏ธโƒฃ
  3. ๐Ÿš€ VOLUNTEER - SUPERVISOR COMMUNICATION 3๏ธโƒฃ

๐Ÿ’Žโค๏ธ Ruby for Good

  • A nonprofit writing software (primarily in ruby) for many nonprofits
  • Human Essentials, Terrastories, Circulate Tool Library for Chicago and beyond, Shelter Assist, Mutual Aid, Abalone, and others!
  • Project list rubyforgood.org/our-work/impact
  • A friendly place to start doing OSS + learn by doing
  • 2 yearly conferences (east/west USA)
  • Slack rubyforgood.herokuapp.com

๐Ÿ’Žโค๏ธ Ruby for Good -> CASA

  • A former Prince George County (MD) CASA volunteer joined Ruby for Good
  • 2019 - I signed up for a conference!
  • Team lead? Sure! โœ… ("Details TBD")
  • Assigned to CASA ๐Ÿ‘
  • Planning, UI mockups, DB schema...
  • 2020 surprise ๐Ÿ˜ฑ remote ๐Ÿ˜ฑ conference ๐Ÿ’Žโค๏ธ

meta

Why do (our) contributors volunteer?

  • Job credibility ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป
  • Open Source Software ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป
  • Meet the kind of people ๐Ÿ™‹๐Ÿป who put time into helping other people ๐Ÿ™‹๐Ÿป

Theory of maintenance

(my) maintaining is 80% making it easy for OTHER people to do work ๐Ÿ’ช ๐Ÿ› 

Be a safety net โšก๏ธโš•๏ธ

OSS but SAAS

Software As A Service is fundamentally different from library development

  • merging doesn't make it real
  • No CI matrix / backwards compatibility issues โฎ
  • (donated) hosting ๐Ÿ’ธ

SAAS

  • ๐Ÿ”’ You are holding someoneโ€™s data; keep it safe! ๐Ÿ˜ฐ
  • โ›”๏ธ๐Ÿ”จ๐Ÿ›  non technical stakeholders
  • ๐Ÿ“ž customer support + uptime

our priorities

  1. Data safety ๐Ÿ”’
  2. Empower CASA volunteers ๐Ÿ’–
  3. Improve CASA organizational efficiency ๐Ÿ’–
  4. Help contributors grow skills ๐ŸŒฑ

What works?

โœ… โœ… โœ… โœ… โœ… โœ… โœ…

(for us)

  • Human impact && stakeholder interactions
  • Cadence and breaks
  • Ruby for Good Conferences
  • ๐ŸŽƒ๐Ÿ˜ฑ๐Ÿ˜ญ๐Ÿš€
  • Calendar
  • Slack
  • GitHub
  • Deployment
  • Code
  • Fast PR merge
  • Community
  • ๐Ÿ’ป๐ŸŒฑ

โœ… Human impact

  • Clear & simple causal chain to human impact
  • Some contributors have a personal connection
  • Stakeholder contact increases connection

โœ… Stakeholder interactions

  • Regular short check-ins for ideation
  • Notes doc 2019-present ๐Ÿ“
  • CASAs talk to each other ๐ŸŽ™
  • Weekly progress email
  • Always CC casa@rubyforgood.org
  • Smart typeform bug reporter ๐Ÿ’ก๐Ÿž
  • YouTube playlists of product walk-throughs โ–ถ๏ธ

โœ… Cadence and breaks

  • Weekly stakeholder sync
  • Weekly office hours (same day)
  • Weekly deploy
  • Slow/lean times between big events

โœ… Ruby for Good Conferences

  • 2x / year (east / west coast USA)
  • New friends!
  • Speedrun onboarding
  • Project level deep direction setting

โœ… Company "offsite" visitors

๐Ÿโ›ฑ

  • "Power Week" with powerhrg.com
  • Various Ruby for Gooders' entire work teams
  • Non-developer work is a precious commodity in OSS
  • Contact casa@rubyforgood.org if you/r team are interested ๐Ÿ’ช๐Ÿ’–

โœ… Hacktoberfest

๐ŸŽƒ๐Ÿ˜ฑ๐Ÿ˜ฑ๐ŸŽƒ

๐ŸŽƒ hacktoberfest.digitalocean.com
๐Ÿ˜ฑ blog.domenic.me/hacktoberfest

โœจgithub.com/rubyforgood/casa/graphs/contributorsโœจ

โœ… Calendar

โœ… Slack

  • Part of Ruby for Good slack
  • Active public channel
  • Channel reminders
  • Leads private channel
  • Bot channel (PRs, issues, errors, deploys)

โœ… Continuous Integration

โœ… GitHub

  • Continuous integration split into named build sections
  • Dependabot ๐Ÿ’–
  • Project management ๐Ÿ“Š
  • Workflows
    (auto-comment, auto-unassign) via github actions
  • Wiki
  • PR templates
  • Issue templates
  • PR merging strategy โžก๏ธโœ…๐Ÿ˜ฑ (TBC)

โœ… GitHub permissions

  • ๐Ÿ”’ Protect your main branch!
  • ๐ŸŒณ Branches - maintainer-merger convenience
  • ๐Ÿด Forks - more educational

Issue Templates

โœ… Deployment

  • PR merge -> auto-deploys to QA ๐Ÿ›บ
  • Manual deploy to staging
  • Manual deploy to prod ๐Ÿš€
  • Deploy checklist โœ‰๏ธ
  • Check on DB backups ๐Ÿ“€
  • Check on email health
  • Heroku teams + pipelines
  • Heroku scheduler (cron) ๐Ÿ•’
  • Papertrail (logs) ๐Ÿ“„
  • Bugsnag ๐Ÿž

โœ… Code

  • Test LOTS
  • Limit javascript
  • Readme!
  • Dependencies: stick to standards, stay basic and picky e.g. devise, pundit, draper, bootstrap, factorybot, letter_opener, sablon
  • StandardRB linting
  • Realistic seed data
  • Docker or not ๐Ÿ‹
  • Thin android app for better user experience

โœ… Fast PR merge!!!

  • Retention & growth ๐ŸŒฑ ๐Ÿ“ˆ โœจ
  • Lead approves, lead merges ๐Ÿ’จ
  • Merging deploys, but not to production
  • Deployment pipeline as safety net โšฝ๏ธ ๐Ÿฅ…
  • Test LOTS ๐Ÿ’ฏ

โœ… Community

  • Ruby for Good negotiates for compute resources for *all* projects
  • Cross-project help squad
  • Second-order backup for AFK maintainers

Keep doing

โœ… ๐Ÿ’–

  • Be people at each other
  • Chill sometimes โ˜ƒ๏ธ
  • Group events! ๐ŸŽณ
  • Use powerful tools ๐Ÿ› 
  • Deploy often and carefully ๐Ÿ’ช
  • Wary code choices ๐Ÿ”ฎ
  • Accept PRs joyfully ๐Ÿ™
  • Community
  • โœจ ๐Ÿ’Ž โค๏ธ

Hard things

โŒ ๐Ÿ˜ฐ ๐Ÿ˜ญ ๐Ÿ˜ฑ โŒ

(for us)

  • Need more issues
  • System edges
  • Historical records
  • Testing is hard
  • Feedback
  • โ“

โŒ More issues, please!

Small bites ๐Ÿช

  • 2-10 / week
  • ALL / 3 days (during conferences)
  • This is a great problem?
  • Writing issues takes effort

โŒ System edges - Import

(table-based data)

  • Volunteers, cases, supervisors, and the linkages between them
  • Override existing data by unique key? ๐Ÿ”จ
  • De-duplicate duplicate rows? ๐Ÿคฆ๐Ÿป
  • Partial error - row 1 succeeds, row 2 fails ๐Ÿ›‘ โžก๏ธ ๐Ÿ›‘ โ†ฉ๏ธ
  • Row dependencies- row 3 references row 2 and 1. Keep it? โญโฎ
  • Display per-row errors ๐Ÿ› 

โŒ System edges - Export

  • Word documents are hard
  • User supplied court report template format with header logo (one per CASA organization, + a default)
  • User-created data (case contacts)
  • Slice and dice date-based data
  • Yay sablon (rubygem)

โŒ Memory

  • Search Slack history
  • Search old github issues
  • Meeting notes doc 2019-present
  • Wiki
  • Architectural Decision Records
  • Verbal history

It's never enough

I don't think we can fix this

โŒ What is a good test?

Good testing is a skill not as easy to specify in acceptance criteria as visible functionality

โŒ Missing-contributor feedback

The people who leave don't say why. Measure what happens. Hear the concerns of the people who stay

Working on

๐Ÿ“ˆ ๐Ÿ’ช ๐Ÿ˜… ๐Ÿ› 

  • Backlog
  • System edges ๐Ÿ‰
  • Future Archaeology
  • Testing
  • Contributor feedback
  • โ“

๐Ÿ’ก Encouraged contributors... ๐Ÿ’ก

๐Ÿ’ก ...become strong contributors ๐Ÿ’ก

๐Ÿ“ A note on purpose

What is your project's purpose?

Improve the world! โœจ

What are your contributors' purposes?

OSS skills, job credibility, learn ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป

What are your users' purposes?

Serving CASA youth ๐Ÿ’ช

What is your purpose as a maintainer?

Smooth the path ๐Ÿ›ฃ

Tips ๐Ÿ’ก

  1. When you want users to upload a spreadsheet, provide a downloadable sample spreadsheet
  2. Use github workflows to automate polite stale issue un-assignment to replace maintainer emotional labor
  3. PRs that each deployed cleanly may not deploy cleanly together
  4. Word documents save edit history- check for sensitive info before attaching one to a github issue

to recap...

  • Multi-level safety nets ๐Ÿฅ…โšฝ๏ธโœจ
  • Serve stakeholders ๐Ÿ“ˆ and grow contributors ๐ŸŒฑ
  • Strong cadence ๐Ÿ“…
  • Sustainable โ™ป๏ธ maintainership requires rest ๐Ÿ’ค and a community ๐Ÿ‘‹ (for me)

Send halp

  1. More CASA regional organizations - we're at ~4/900+
    We're free and friendly!
  2. PM, QA, design!!! ๐Ÿ“Š ๐Ÿž ๐ŸŽจ
  3. PRs, especially testing & refactoring ๐Ÿฆ

๐Ÿšฒ @goldlindastein โœจ @rubyforgood ๐Ÿ’Ž

linda@rubyforgood.org โœจ casa@rubyforgood.org

Join us on slack! rubyforgood.herokuapp.com

Thanks

Sean (seanmarcia), Zoe (Zrrrpy), Eric (Thrillberg), Jeanine (littleforest), Shen (FireLemons), Michaela (CH), and MANY more!

Heroku, Azure

Questions?

๐Ÿšฒ @goldlindastein โœจ @rubyforgood ๐Ÿ’Ž

linda@rubyforgood.org โœจ casa@rubyforgood.org

Join us on slack! rubyforgood.herokuapp.com

                
                  # seed realistic case numbers
                  @case_number_sequence = 1000
                  CASE_TYPES = ["CINA", "TPR", ""]
                  def generate_case_number # format different per region! PG CASA
                    # CINA-YY-XXXX Child In Need of Assistance
                    # TPR-YY-XXXX Termination of Parental Rights
                    years = ((DateTime.now.year - 20)..DateTime.now.year).to_a
                    yy = years.sample(random: rng).to_s[2..3]
                    @case_number_sequence += 1
                    "#{CASE_TYPES.sample(random: rng)}-#{yy}-#{@case_number_sequence}"
                  end
                
            

Fictive Kin

Fictive Kin โ€“ children are placed with an individual, unrelated by birth or marriage, who has personal or emotional ties with the children or their family prior to the placement (e.g. family friends, school staff, babysitters, etc.). Someone who is known to, and trusted by, the child(ren).

The Kinship Care and Fictive Kin Reform Act ... allows the Department to place the child with a relative or individual not related by birth, adoption, or marriage, but who maintains an emotionally significant relationship with the child.

                
                    ### What github issue is this PR for, if any?
                    Resolves #2XXX
                    ### What changed, and why?
                    ### How will this affect user permissions?
                    - Volunteer permissions:
                    - Supervisor permissions:
                    - Admin permissions:
                    ### How is this tested? (please write tests!) ๐Ÿ’–๐Ÿ’ช
                    ### Screenshots please :)
                    ### Feelings gif (optional)
                    What gif best describes your feeling working on this issue? https://giphy.com/
                    How to embed:
                    `![alt text](https://media.giphy.com/media/1nP7ThJFes5pgXKUNf/giphy.gif)`
                
            

Working with Word docs

  • Not all developers have Word
  • Google Drive does not render the same
  • LibreOffice does not render the same
  • Deleted content is still present- watch out for invisible sensitive data
                
                    gem "after_party" # post-deployment tasks
                    gem "amazing_print" # easier console reading
                    gem "azure-storage-blob", require: false
                    gem "bootsnap", ">= 1.4.2", require: false # Reduces boot times through caching; required in config/boot.rb
                    gem "bugsnag" # tracking errors in prod
                    gem "devise" # for authentication
                    gem "devise_invitable"
                    gem "draper" # adds decorators for cleaner presentation logic
                    gem "faker" # creates realistic seed data, valuable for staging and demos
                    gem "filterrific" # filtering and sorting of models
                    gem "image_processing", "~> 1.12" # Set of higher-level helper methods for image processing.
                    gem "jbuilder", "~> 2.11" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
                    gem "lograge" # log less so heroku papertrail quits rate limiting our logs
                    gem "noticed" # Notifications
                
            
                
                    gem "paper_trail" # tracking changes
                    gem "paranoia", "~> 2.2" # For soft-deleting purpose
                    gem "pg", ">= 0.18", "< 2.0" # Use postgresql as the database for Active Record
                    gem "puma", "~> 5.4" # Use Puma as the app server
                    gem "pundit" # for authorization management - based on user.role field
                    gem "rack-attack" # for blocking & throttling abusive requests
                    gem "request_store"
                    gem "sablon" # Word document templating tool for Case Court Reports
                    gem "skylight" # automated performance testing https://www.skylight.io/
                    gem "webpacker", "~> 5.4" # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
                
            

Our maintainer selection

  • Informal
  • ๐Ÿ›  Do work ->
  • ๐ŸŽ‰ Get invited ->
  • ๐Ÿ’ช Get permissions ->
  • ๐Ÿ›  Do more work ->
  • ๐Ÿ˜… [Optional] fade away
  • ๐Ÿ’ก ...maybe we should change this?

Questions?

๐Ÿšฒ @goldlindastein โœจ @rubyforgood ๐Ÿ’Ž

linda@rubyforgood.org โœจ casa@rubyforgood.org

Join us on slack! rubyforgood.herokuapp.com