CuHaSc: Culture Handbook for Scrum
A simple webapp with which agile software development teams can determine their culture profile and receive advice on plausible agile process execution problems that may arise from it.
Cuhasc is based on Python and Django.
It uses the built-in SQlite3 as the RDBMS and a built-in webserver (waitress) for HTTP
in order to provide the simplest possible deyployment.
The application itself is also kept very simple and provides only a minimal level of security.
1. How it works
- Culture Lead (often the Scrum Master) sets up a Culture Profiling process for one new Team in Cuhasc. (Technically, anybody can set up a new Team at any time.)
- Cuhasc provides a joint URL for the Team Members to use.
- Culture Lead sends URL to all Team Members. There are no accounts, just confidential tokens in URLs and a cookie that remembers them.
- Each Team Member visits URL and fills in the Culture Profile Questionnaire. The questionnaire is available in 40 languages; Members should use their native language.
- Cuhasc computes the member's Culture Profile, the team's Overall Culture Profile, and the resulting list of likely agile process execution problems. The handbook embedded in the app knows about many such problems and will show exactly those that are likely to apply to the given team.
- Culture Lead discusses the individual execution problems with the team.
For the handbook content, see cuhasc/data/handbook/. Each file there discusses one kind of recurring culture-induced agile process execution problem.
2. The science behind it
The culture profile is based on the famous Hofstede dimensions of national cultures.
The specific questionnaire used is the psychometrically validated CVscale, which transfers the Hofstede dimensions to the level of an individual. Hofstede's original questionnaire applied only at the national level.
CVscale is originally avaiable in English. The many translations provided here were worked out by Claude Opus 4.8 instructed by a sophisticated prompt that ensures that the meaning of each item is kept the same as much as possible in each language, despite problems with different registers of language use, unwanted term parallels or term variations, lower or higher or different ambiguity of an otherwise-suitable term, unwanted connotations of otherwise-suitable terms, and other subleties.
This is important, because the meaning of the Overall Culture Profile is well-defined only if the questionnaire means the same to all members in all its cultural facets. If you want to scrutinize the difficulties for your target language(s), review the translation notes.
The agile execution problems represented in the handbook were found by a literature search through the rather extensive research literature on agile software development, looking for those few of the many articles that describe problems with enough detail that they can be traced to (likely) team-cultural causes.
TODO: The handbook provides pointers to the specific research articles underlying each handbook section.
3. Installation/deployment
- Cuhasc runs on any recent or modestly old Linux, Windows or macOS system.
- It is meant to be used by a single team only, but can also be used by several teams that trust each other.
- There are four modes in which you can install and run it:
- 3.1: On a proper server that all users can reach.
- 3.2: On your developer machine in a LAN if all Team Members are in that LAN and you have opened the firewall on your machine.
- 3.3: On your developer machine, using
cloudflaredorngrokfor making it visible as a pseudo-public server via a tunnel. This involves some (fairly simple) setup for the operator and uses the free tier of a commercial service. Drawback: The URL so-created remains valid only until the next reboot or even standby. - 3.4: On your developer machine, using
tailscalefor creating a private network for your team only. This involves some (reasonably simple) setup for each team member and also uses the free tier of a commercial service.
3.0 Basic install
This is required before each of the subsequent scenarios 3.1 to 3.4.
- Install the
uvpackage manager as described here: https://docs.astral.sh/uv/getting-started/installation/ If you have some version of it already installed, that will likely work fine as well. uv tool install cuhasc- Review the output of the following calls:
cuhasc --helpcuhasc infocuhasc run --help
- The DBMS is SQLite. This is built-in into Python, so no separate setup is needed at all.
There is no DB setup step, either.
cuhasc runis how you start the webserver built intocuhascand you could do that now. - The data directory
~/.cuhasc/(same path on all OSs) holds the database filedb.sqlite3and the app-localsecret_key. These files are the entire application state. Back it up by copying it (or usecuhasc backupfor a DB backup). It survives upgrades and uninstalls. - Upgrade
cuhascwithuv tool upgrade cuhascwhen desired. Database migrations run automatically at every application start.
3.1 Running on a proper server
- Simplest:
cuhasc runas in the basic install, just on a server computer rather than a developer notebook. Make sure the port you use is open in the server's firewall. - The professional variant:
cuhasc runwith a reverse proxy (Apache, nginx, ...) in front that terminates TLS. Cuhasc speaks plain HTTP only; encryption is always somebody else's job. - Alternative: serve
cuhasc.wsgi:applicationunder gunicorn or another WSGI server. ThenCUHASC_HOME(default:~/.cuhasc/),CUHASC_SECRET_KEY(a fixed random string), andCUHASC_ALLOWED_HOSTS(comma-separated list of target hostnames allowed in requests) must be set explicitly (becausecuhasc runis what otherwise supplies them). More complicated, hence recommended only if you have a good reason for it.
Set up a minimal systemd unit so the server survives a reboot.
Only one running instance is allowed per data directory.
3.2 Running on a developer machine in a joint LAN
cuhasc runand nothing else: it binds all interfaces on port 8037 by default.- Open the firewall for that port.
On Windows, the first start will raise a Windows Defender dialog;
cuhascmust be allowed for private networks. - Hand the Team Members the "on this LAN" URL that the start-up banner prints.
- No
--public-urlneeded here: plain HTTP within one LAN needs no extra configuration.
Be aware that everybody on this LAN can in principle read all traffic to and fro this server now.
3.3 Running on a developer machine via cloudflared or ngrok tunnel (--> temporary public server)
- Install
cloudflared: https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/
We will use the "trycloudflare" free tier. - First start the tunnel, which prints its public URL immediately:
cloudflared tunnel --url http://localhost:8037orngrok http 8037. - Only then start cuhasc with that URL:
cuhasc run --host 127.0.0.1 --public-url https://<the-printed-cloudflared-url>. --public-urlis not optional: the tunnel terminates TLS, so the browser reports an https origin that Django would otherwise not recognize, and every form submission would fail with a 403.
--host 127.0.0.1keeps the app off the LAN because the tunnel is meant to be the only way in.
This setup is great if all team members fill the questionnaire within the same half-day or so. It is inconvenient otherwise: The URL dies at the next reboot or standby of your "server" machine. Both commands above must then be repeated and the hostname will have changed, so all links need to be sent out again.
ngrok uses a similar concept, see here: https://ngrok.com/
3.4 Running on a developer machine via a tailscale network (--> semi-permanent group-private server)
If you intend to use cuhasc for some longer time, this approach may be preferable.
It requires more setup, but produces less hassle then.
- Each Team Member installs tailscale and joins the tailnet, see here: https://tailscale.com/docs/how-to/quickstart
cuhasc run --public-url http://<machine>.<tailnet>.ts.net:8037.- In contrast to the
cloudflaredapporach, the hostname is stable, so the links keep working across reboots.
4. Admin/superuser access
If you lost both your team-level URL and the cookie that stored it,
you can retrieve the URL by opening the "admin page" that is indicated in the
start message of any cuhasc run call.
As cuhasc has no user authentication whatsoever, the security of this page is maintained
simply by keeping this (random) URL confidential.
If that URL has leaked, you can set a random new one by calling
cuhasc adminpage.
5. Repo directory tree
.agents/skillsshadow copy of.claude/skillsvia a symbolic link.claude: Skills and settings for Claude code. Most skills are originally fromhttps://github.com/mattpocock/skills, but several of these are modified.translate-cvscaleis what produced the many translations of the questionnaire,review-cvscale-translationhas been used only very little.cmd: stand-alone helpers, e.g. shell scriptscuhasc: the main tree. Contains the Django application, its static resources, the actual handbook data (cuhasc/data/handbook/*), the individual language versions of the questionnaire (cuhasc/data/instrument/*).dist(non-versioned): packaged release versions of cuhascdocs/adr: architecture decision recores. Long-range design decisions and their rationale.docs/agents: helper documents used by some of the skills.instruments/: documents created for or while producingcuhasc/data/instrument/*(which formerly lived in this same directory as well).
Important top-level files:
CONTEXT.md: key terminologymanage.py: Django's utility command filepyproject.toml: Declaration of the package structure.
6. Development
See AGENTS.md.
7. Next development steps
- ...
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cuhasc-0.7.0.tar.gz.
File metadata
- Download URL: cuhasc-0.7.0.tar.gz
- Upload date:
- Size: 402.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f30b35879b107cce554584533a3937ccdae276dfe138e7acc853a79aa05deb45
|
|
| MD5 |
1b91bf3fa381befeca2293c6abf5590c
|
|
| BLAKE2b-256 |
b6038a0c9c5f72f78b0318d6d593e40a5a3af46a2462d294c52da559db035653
|
File details
Details for the file cuhasc-0.7.0-py3-none-any.whl.
File metadata
- Download URL: cuhasc-0.7.0-py3-none-any.whl
- Upload date:
- Size: 213.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f2f08696d8a5441ad6e6963ca705f9b4b124365be51b716c56bfe52e1404d06
|
|
| MD5 |
db74ced1bec425a007abce277f9104b2
|
|
| BLAKE2b-256 |
86bd6612224f91608bffd2d325228c8c2149a28e4f771f749ab7ba3422acdfbe
|