{"id":35655136,"url":"https://github.com/sanger/sequencescape","last_synced_at":"2026-04-10T10:08:31.594Z","repository":{"id":38431744,"uuid":"1630922","full_name":"sanger/sequencescape","owner":"sanger","description":"Web based LIMS","archived":false,"fork":false,"pushed_at":"2026-04-08T08:15:46.000Z","size":61384,"stargazers_count":111,"open_issues_count":163,"forks_count":34,"subscribers_count":5,"default_branch":"develop","last_synced_at":"2026-04-08T10:32:09.162Z","etag":null,"topics":["biology","lims","rails","ruby","science"],"latest_commit_sha":null,"homepage":"http://sanger.github.io/sequencescape/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sanger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2011-04-18T14:45:18.000Z","updated_at":"2026-04-08T08:13:41.000Z","dependencies_parsed_at":"2023-10-12T19:58:44.871Z","dependency_job_id":"915d1f47-6b6d-47ca-8eaa-ea9029e37062","html_url":"https://github.com/sanger/sequencescape","commit_stats":null,"previous_names":[],"tags_count":4623,"template":false,"template_full_name":null,"purl":"pkg:github/sanger/sequencescape","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanger%2Fsequencescape","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanger%2Fsequencescape/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanger%2Fsequencescape/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanger%2Fsequencescape/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sanger","download_url":"https://codeload.github.com/sanger/sequencescape/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanger%2Fsequencescape/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31637761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biology","lims","rails","ruby","science"],"created_at":"2026-01-05T15:15:20.349Z","updated_at":"2026-04-10T10:08:31.570Z","avatar_url":"https://github.com/sanger.png","language":"Ruby","readme":"# \u003cimg src=\"app/frontend/images/logo-gradient.svg\" alt=\"logo\" style=\"height:1em;vertical-align:middle;\"\u003e Sequencescape\n\n![Ruby Test](https://github.com/sanger/sequencescape/workflows/Ruby%20Test/badge.svg)\n![Javascript testing](https://github.com/sanger/sequencescape/workflows/Javascript%20testing/badge.svg)\n![Linting](https://github.com/sanger/sequencescape/workflows/Linting/badge.svg)\n[![Test Coverage](https://codecov.io/github/sanger/sequencescape/graph/badge.svg?token=Fsd7I0GYQf)](https://codecov.io/github/sanger/sequencescape)\n[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://sanger.github.io/sequencescape/)\n[![Knapsack Pro Parallel CI builds for RSpec Tests](https://img.shields.io/badge/Knapsack%20Pro-Parallel%20%2F%20RSpec%20Tests-%230074ff)](https://knapsackpro.com/dashboard/organizations/1976/projects/1324/test_suites/1880/builds?utm_campaign=organization-id-1976\u0026utm_content=test-suite-id-1880\u0026utm_medium=readme\u0026utm_source=knapsack-pro-badge\u0026utm_term=project-id-1324)\n[![Knapsack Pro Parallel CI builds for Cucumber Tests](https://img.shields.io/badge/Knapsack%20Pro-Parallel%20%2F%20Cucumber%20Tests-%230074ff)](https://knapsackpro.com/dashboard/organizations/1976/projects/1324/test_suites/1881/builds?utm_campaign=organization-id-1976\u0026utm_content=test-suite-id-1881\u0026utm_medium=readme\u0026utm_source=knapsack-pro-badge\u0026utm_term=project-id-1324)\n\nSequencescape is a cloud based and highly extensible LIMS system for use in labs with large numbers\nof samples.\n\n- Work order tracking\n- Sample and study management\n- Capacity management for pipelines\n- Accounting\n- Accessioning for samples and studies at the EBI ENA/EGA\n- Dynamically defined workflows for labs with support for custom processes\n- Labware and freezer tracking\n- API support for 3rd party applications\n\nCurrent installation supports over 5 million samples and 1.8 million pieces of labware and is used in\na organisation of 900 people.\n\n## Contents\n\n\u003c!-- toc --\u003e\n\n- [Documentation](#documentation)\n  - [Linting](#linting)\n- [Requirements](#requirements)\n- [Getting started (using Docker)](#getting-started-using-docker)\n- [Getting started (using native installation)](#getting-started-using-native-installation)\n  - [Installing ruby](#installing-ruby)\n    - [rbenv](#rbenv)\n  - [Automatic Sequencescape setup](#automatic-sequencescape-setup)\n  - [Manual Sequencescape setup](#manual-sequencescape-setup)\n    - [Installing gems](#installing-gems)\n    - [Adjusting config](#adjusting-config)\n    - [Default setup](#default-setup)\n  - [Starting rails](#starting-rails)\n  - [Vite](#vite)\n    - [Delayed job](#delayed-job)\n  - [Message broker](#message-broker)\n- [Testing](#testing)\n- [Linting and formatting](#linting-and-formatting)\n- [Rake tasks](#rake-tasks)\n- [Feature flags](#feature-flags)\n- [Supporting applications](#supporting-applications)\n  - [Barcode printing](#barcode-printing)\n  - [Plate barcode service](#plate-barcode-service)\n  - [Data warehousing](#data-warehousing)\n- [Miscellaneous](#miscellaneous)\n  - [Lefthook](#lefthook)\n  - [Ruby warnings and rake 11](#ruby-warnings-and-rake-11)\n  - [NPG - Illumina tracking software](#npg---illumina-tracking-software)\n  - [Troubleshooting](#troubleshooting)\n    - [MySQL errors when installing](#mysql-errors-when-installing)\n    - [MySQL errors after system updates](#mysql-errors-after-system-updates)\n    - [Installing on Apple Silicon (M1)](#installing-on-apple-silicon-m1)\n  - [API V2 Authentication](#api-v2-authentication)\n  - [Publishing AMQP Messages](#publishing-amqp-messages)\n  - [CI](#ci)\n  - [ERD](#erd)\n  - [Updating the table of contents](#updating-the-table-of-contents)\n\n\u003c!-- tocstop --\u003e\n\n## Documentation\n\nThe Yard documentation is also hosted at [GitHub Pages](https://pages.github.com/) under [https://sanger.github.io/sequencescape/](https://sanger.github.io/sequencescape/).\nThe documentation is automatically updated via a CI workflow when a merge to master occurs, but you can also trigger it manually against any branch (the branch can be selected using the \"Run Workflow\" button in the [corresponding action](https://github.com/sanger/sequencescape/actions/workflows/generate_pages.yml)).\n\nTo preview this documentation, you can spin up a yard server locally using the following command:\n\n```shell\nyard server --reload sequencescape .\n```\n\nYou can then access the Sequencescape documentation through: [http://localhost:8808/docs](http://localhost:8808/docs)\n\nIf the server complains that the stack depth is too deep, this only appears to be a problem when you try to view the documentation without pre-compiling it.\nPrecompiling is the simple solution and can be achieved with the following.\n\n```shell\nyard doc\n```\n\nThis will pre-fill the cache and allow the server command above to display the documentation without complaining about stack depths.\n\n### Linting\n\nYard-Junk is used to check for missing or incorrect documentation. To run the checks:\n\n```shell\nbundle exec yard-junk --sanity\n```\n\n## Requirements\n\nThe following tools are required for development:\n\n- ruby (version defined in the `.ruby-version`)\n- yarn (`brew install yarn`)\n- node (`brew install node@\u003cversion\u003e` version defined in the `.nvmrc`, ensure node is in your PATH)\n- mysql client libraries - if you do not want to install mysql server on your machine, consider\n  using mysql-client: `brew install mysql-client`. Alternatively, to install the MySQL required by\n  Sequencescape (currently 8.0)\n\n## Getting started (using Docker)\n\nTo set up a local development environment in Docker, you have to build a new Docker image for\nSequencescape. start a stack of services that include a mysql database, and reset\nthis database contents. You can do all together by running the commands:\n\n```shell\ndocker compose build\nRESET_DATABASE=true docker compose up\n```\n\nOr if you are using an Apple M1 Chip:\n\n```shell\ndocker compose build --build-arg CHIPSET=m1\nUSE_POLLING_FILE_WATCHER=true RESET_DATABASE=true docker compose up\n```\n\nOptionally, if this is not the first time you start the app, you may not want to reset the\ndatabase, and you can run this command instead:\n\n```shell\ndocker compose up\n```\n\nWith this we should have started Sequencescape server and all required services. You should be\nable to access Sequencescape by going to \u003chttp://localhost:3000\u003e and log in with\nusername and password admin/admin.\n\nThe envvar `PRECOMPILE_ASSETS` is also available as `PRECOMPILE_ASSETS=false docker compose up` which will avoid precompiling the assets as Sequencescape is started.\n\nIf you are using [Apple silicon](https://support.apple.com/en-gb/HT211814) and encounter any issues, please see [Troubleshooting](#installing-on-apple-silicon-m1) below.\n\n**ABOUT LOCAL DEVELOPMENT SETUP** You may want to start only the required services for Sequencescape (server and jobs worker) and use your local version of Mysql\ninstead of the Docker version, in that case you can start this setup with the\ncommand:\n\n```shell\ndocker compose -f docker-compose-dev.yml up\n```\n\n**ABOUT RECREATE DOCKER IMAGE** If you ever need to recreate the image built on first start (because you made modifications to the Dockerfile file or there have been dependency updates) you can re build the image again with (or see above for M1 Apple chip):\n\n```shell\ndocker compose build\n```\n\n## Getting started (using native installation)\n\nThis section only applies if you don't have Docker installed or if you prefer a native installation\nof Sequencescape.\n\n### Installing ruby\n\nIt is strongly recommended that you use a ruby version manager such as RVM or rbenv to manage the\nRuby version you are using. The ruby version required should be found in `.ruby-version`.\n\n#### rbenv\n\nIf you have the [rbenv ruby-build plugin](https://github.com/rbenv/ruby-build) it is as simple as:\n\n`rbenv install`\n\nIt will pick up the version from the .ruby-version file automatically\n\n### Automatic Sequencescape setup\n\nTo automatically install the required gems, set-up default configuration files, and set up your database run:\n\n```shell\nbin/setup\n```\n\n### Manual Sequencescape setup\n\nIn the event you have trouble with the automatic process, you may wish to step through the various steps manually.\n\n#### Installing gems\n\n[Bundler](https://bundler.io) is used to install the required gems:\n\n```shell\ngem install bundler\nbundle install\n```\n\n#### Adjusting config\n\nThe `config/database.yml` file saves the list of databases.\n\n#### Default setup\n\n1. Create the database tables\n\n   ```shell\n   bundle exec rake db:setup\n   ```\n\n2. Install webpacker and the required JS libraries\n\n   ```shell\n   yarn\n   ```\n\n### Starting rails\n\n```shell\nbundle exec rails s\n```\n\nOnce setup, the default user/password is `admin/admin`.\n\n### Vite\n\nEnsure Node is installed, and in your PATH. You might need to run\n`bin/vite build --clear --mode=development`\n\n#### Delayed job\n\nFor background processing Sequencescape uses `delayed_job` to ensure that the server is running. It\nis strongly recommended to start one for Sequencescape to behave as expected.\n\n```shell\nbundle exec rake jobs:work\n```\n\nOR\n\n```shell\nbundle exec ./script/delayed_job start\n```\n\n### Message broker\n\nSequencescape has its own message broker and consumer. To develop this or run it locally, you\nmust have RabbitMQ installed. It may be easiest to use the docker image [https://hub.docker.com/\\_/rabbitmq](https://hub.docker.com/_/rabbitmq).\n\n`docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management`\n\nIt can be useful to follow the rabbitmq logs, to look for broken connections or other problems. To do this using the docker image,\nget the container id using `docker ps`, and then:\n\n`docker logs -f \u003ccontainer id\u003e`\n\nTo start the consumer off listening for messages:\n\n`bundle exec warren consumer start`\n\nThe consumer will run in the foreground, logging to the console. You can stop it with Ctrl-C.\n\nFor more warren actions, either use `bundle exec warren help` or see the\n[warren documentation](https://rubydoc.info/gems/sanger_warren)\n\nYou will also have to change the config in config/warren.yml from `type: log` to `type: broadcast` to get\nit to actually send messages in development mode.\n\n### Credentials\n\nSecrets are managed differently after the Rails 7.2 update. The setup can be done by running the command `bundle exec rails credentials:edit` locally\n\nThis will create a `credentials.yml.enc` and `master.key` in the config directory\n\nYou can then edit the credentials file with the following command:\n`VISUAL=\"nano --wait\" bin/rails credentials:edit`\n\nThese should not be committed to the github repo.\n\n## Testing\n\nTesting is done in one of three ways; using rspec, via rails tests or with cucumber.\n\n1. To run the rspec tests (found in `rspec/` dir.):\n\n   ```shell\n   bundle exec rspec --fail-fast [\u003cpath_to_spec\u003e]\n   ```\n\n1. To run the rails tests (found in `tests/` dir.):\n\n   ```shell\n   bundle exec rake test -f\n   ```\n\n   For a single file:\n\n   ```shell\n   bundle exec ruby -Itest test/lib/label_printer/print_job_test.rb\n   ```\n\n1. To run cucumber tests (found in `features/` dir.) first ensure you have a `sequencescape_test_cuke` database configured by running:\n\n   ```shell\n   RAILS_ENV=cucumber bundle exec rake db:setup\n   ```\n\n   then run cucumber itself:\n\n   ```shell\n   bundle exec cucumber\n   ```\n\nFor a single file:\n\n```shell\nbundle exec cucumber features/create_plates.feature\n```\n\n## Linting and formatting\n\nRubocop is used for linting and formatting.\n\n```shell\nbundle exec rubocop --autocorrect\n```\n\nNote that permanent `Exclude`s should be defined in `.rubocop.yml`, with 'temporary' ones\n(automatically) listed in `.rubocop_todo.yml`.\n\nTo update `.rubocop_todo.yml`, execute\n\n```shell\nrubocop --auto-gen-config --no-exclude-limit\n```\n\nPrettier is used for formatting.\n\n```shell\nyarn prettier --check .\nyarn prettier --write .\n```\n\n(If prettier is not yet installed, run `yarn`. This should have ben run in `bin/setup`)\n\n- Prettier rules are configured in .prettierrc.json\n- Whole files can be ignored in .prettierignore\n- Sections of files can be disabled using #prettier-ignore\n\n## Rake tasks\n\nRake tasks are available for specialised tasks as well as support tasks. Support tasks allow ease\nof running standalone scripts multiple times.\n\nA breakdown of the the available tasks and how to run them can be found [here](lib/tasks/README.md)\n\n## Feature flags\n\nThe use of feature flags is encouraged for development.\n\n[Flipper](https://github.com/flippercloud/flipper) is used for flag management and flags can be controlled from the `/flipper` route.\n\nTo create a new feature flag, update `config/feature_flags.yml`.\n\n## Supporting applications\n\nThere are a number of services that are needed in certain parts of Sequencescape these are listed\nbelow.\n\n### Barcode printing\n\nBarcode printing is carried out by a separate REST service, PrintMyBarcode. The source\nfor this is also available on GitHub [sanger/print_my_barcode](https://github.com/sanger/print_my_barcode)\n\n### Plate barcode service\n\nDue to DNA plate barcode series being stored in a legacy system in Sanger you are required to use a\nwebservice for supplying numbers for plates with a simple service.\n\n### Data warehousing\n\nThere is a client application for building a data warehouse based on the information in\nSequencescape. This is driven asynchronously via RabbitMQ.\n\nSee our various clients on GitHub:\n\n[sanger/unified_warehouse](https://github.com/sanger/unified_warehouse)\n\n[sanger/event_warehouse](https://github.com/sanger/event_warehouse)\n\n## Miscellaneous\n\n### Lefthook\n\n[Lefthook](https://github.com/Arkweid/lefthook) is a git-hook manager that will\nensure staged files are linted before committing.\n\nYou can install it either via homebrew `brew install Arkweid/lefthook/lefthook` or rubygems `gem install lefthook`\n\nYou'll then need to initialize it for each repository you wish to track `lefthook install`\n\nHooks will run automatically on commit, but you can test them with: `lefthook run pre-commit`\n\nIn addition you can also run `lefthook run fix` to run the auto-fixers on staged files only.\nNote that after doing this you will still need to stage the fixes before committing. I'd love to be\nable to automate this, but haven't discovered a solution that maintains the ability to partially\nstage a file, and doesn't involve running the linters directly on files in the .git folder.\n\n### Ruby warnings and rake 11\n\nRake 11 enables ruby warnings by default when running the test suite. These can be disabled with\n`RUBYOPT='-W0'`, (eg. `RUBYOPT='-W0' bundle exec rake test`).\n\nCurrently these warnings are excessive, covering both our own code and external dependencies. As it\nstands it makes the output of the test suite unusable in travis, as it fills the buffer. These\nwarnings **will** need to be fixed, especially in our own code.\n\n### NPG - Illumina tracking software\n\nFor tracking illumina instruments you need the NPG systems. NPG is linked to Sequencescape via a\ncluster formation batch which represents a flowcell.\n\n[NPG Software](http://www.sanger.ac.uk/resources/software/npg/)\n\n### Troubleshooting\n\n#### MySQL errors when installing\n\n- If you are using homebrew with rbenv and run into errors relating to SSL, have a look [here](https://github.com/brianmario/mysql2/issues/795#issuecomment-433219176)\n\n- If you are upgrading a homebrew MySQL locally and have an error about a missing libmysqlclient dylib file, you may need to redownload the mysql2 gem to fix it i.e. `bundle install --redownload`\n  This is because the mysql2 gem is simlinked to the homebrew mysql.\n\n- If bundle install is failing to install the `mysql2` gem, try the below (updating the paths as required):\n\n```\ngem install mysql2 -v '0.5.6' -- \\\n--with-mysql-lib=/opt/homebrew/Cellar/mysql/ \\\n--with-mysql-dir=/opt/homebrew/Cellar/mysql/9.0.1_1 \\\n--with-mysql-config=/opt/homebrew/Cellar/mysql/9.0.1_1/bin/mysql_config \\\n--with-mysql-include=/opt/homebrew/Cellar/mysql/9.0.1_1/include\n```\n\n#### MySQL errors after system updates\n\nIf you encounter a LoadError at dlopen call to mysql2 bundle because of a missing dynamic library, try the following command to update the cached gem.\n\n```\ngem pristine mysql2\n```\n\n#### Installing on Apple Silicon (M1)\n\nIf installation issues are encountered with Docker on M1 processors, try the fixes below:\n\n- The docker compose build command fails with any mentions to a processor architecture ('amd64', 'x86') or the message below:\n\n  ```sh\n  ...\n  #0 1.528 The following packages have unmet dependencies:\n  #0 1.568  google-chrome-stable:amd64 : Depends: libasound2:amd64 (\u003e= 1.0.17) but it is not installable\n  #0 1.568                               Depends: libatk-bridge2.0-0:amd64 (\u003e= 2.5.3) but it is not installable\n  ...\n  #0 1.568                               Depends: libxkbcommon0:amd64 (\u003e= 0.5.0) but it is not installable\n  #0 1.568                               Depends: libxrandr2:amd64 but it is not installable\n  #0 1.581 E: Unable to correct problems, you have held broken packages.\n  ------\n  failed to solve: process \"/bin/bash --login -c apt install -y ./google-chrome-stable_current_amd64.deb\" did not complete successfully: exit code: 100\n  ```\n\n  Force docker to use the an AMD image as the base by setting `--build-arg CHIPSET=m1` during the build.\n  It is also recommended to [install and enable Rosetta 2](https://docs.docker.com/desktop/install/mac-install/#mac-with-apple-silicon).\n\n- The sequencescape_server container terminates with the error:\n\n  ```sh\n  Function not implemented - Failed to initialize inotify (Errno::ENOSYS)\n  ```\n\n  Use a polling instead of event file update checker by setting `USE_POLLING_FILE_WATCHER=true` during the compose up.\n\n  [[GitHub issue](https://github.com/evilmartians/terraforming-rails/issues/34#issuecomment-872021786)]\n\n#### Cucumber / RSpec feature chromedriver issues\n\nIf you encounter Selenium/Chromedriver issues locally it may be because the latest version of Chrome is yet to be supported by our testing libraries (Capybara). This may require a fix to the `Capybara.rb` file, e.g. new driver arguments. In the case the fix is not identifiable you made need to rely on a pinned version of Chrome in the CI to run these tests, see [Chromedriver issues](#chromedriver-issues) below for further instructions.\n\n### API V2 Authentication\n\nThe V2 API has had authentication checks added to it so that other applications calling the API should provide a valid key.\nThe key is passed by the client application via the `X-Sequencescape-Client-Id` header.\nKeys can be generated via the Rail Console by creating new `ApiApplication` records and observing the `key` attribute on them.\nAs of the time of writing, there are three outcomes to a request made, with respect to API key submission:\n\n- The client calls an API V2 endpoint with a valid API key in the header of the request.\n  - The response given has a valid status code and the body contains the requested information/confirmation.\n- The client calls an API V2 endpoint with an invalid API key in the header of the request.\n  - The response given has status code 401 Unauthorized and contains a JSON body explaining that a valid API key must be provided for the header.\n  - The request is logged with the prefix \"Request made with invalid API key\" including information about the client and the API key used.\n- The client calls an API V2 endpoint without the API key header in the request.\n  - The response is given as if a valid API key was provided.\n  - The request is logged with the prefix \"Request made without an API key\" including information about the client.\n  - The client application should be updated to use a valid API key in future.\n\n#### Documentation\n\nExample POST requests for all the Sequencscape API v2 resources are available to import into Postman REST Client.\n\nThe file `Sequencescape API v2.postman_collection.json` is stored in the Pipeline Solutions Shared Network Drive (Finder \u003e Go \u003e Connect to Server \u003e `smb://files-smb/pipeline_solutions`)\n\n### Publishing AMQP Messages\n\nSome API endpoints (such as `/api/v2/bioscan/export_pool_xp_to_traction`) trigger background jobs which are responsible for publishing data to another instance of RabbitMQ.\nIn the case of the Bioscan Export Pool XP to Traction job, the message goes to the ISG managed RabbitMQ instance.\nIn order to publish a message, the job must get a schema from a registry.\nUnder development conditions, you may not have a registry running, hence the default config directs to the UAT instance of PSD's supported RedPanda.\nThis means, the first time you publish a message with this schema, you need to be connected to the Sanger network directly or via VPN.\nAfter the first use, a cached file will be created in `data/avro_schema_cache` so that the registry does not need to be reachable to continue generating messages.\n\nBecause this is the first and only job doing this pubishing / RedPanda caching / Avro encoding, etc, there are parts which could be extracted in future if further jobs of this type are created.\nThis isn't necessary at this stage, but it seems wise to note the intended pattern of usage here for future work.\n\n### CI\n\nThe GH actions builds use the Knapsack-pro gem to reduce build time by parallelizing the RSpec and Cucumber tests. There is no need to regenerate the knapsack_rspec_report.json file, Knapsack Pro will dynamically allocate tests to ensure tests finish as close together as possible.\n\n#### Chromedriver issues\n\nIf you encounter CI failures for cucumber and rspec feature tests it may be caused by our CI GitHub runner being on the latest version of Chrome while our testing libraries are yet to support it. To fix this, you can pin the version of Chrome in the CI to an older, known working version. This can be done in the `.github/workflows/ruby_test.yml` workflow under `Setup stable Chrome`. If this is required ensure you revert the change once the testing libraries are updated.\n\n### ERD\n\nYou can create a database entity relationship diagram, by specifying the title and attributes optionally, and view the output:\n\n```\nbundle exec rake erd title='Sequencescape Entity Relationship Diagram' attributes='primary_keys,foreign_keys,inheritance' orientation=horizontal polymorphism=true notation=bachman indirect=false inheritance=true only='Sample,Study,AliquotIndex,Aliquot,Project,Order,Submission,Labware,Receptacle,Request,Request::Metadata,Batch,BatchRequest,LabEvent,RequestType,Pipeline,SampleManifest,Sample::Metadata,Study::Metadata,Item,BaitLibrary,RequestEvent,Project::Metadata,Barcode,Purpose,QCResult,QCAssay,User,Plate,Tube,Well' exclude='Target,Commentable,Failable,Eventful,Eventable,Resource,Attributable,Owner,Authorizable,Documentable'\n\nopen erd.pdf\n```\n\nThe command uses the [rails-erd](https://github.com/voormedia/rails-erd) gem.\n\n### Updating the table of contents\n\nTo update the table of contents after adding things to this README you can use the [markdown-toc](https://github.com/jonschlinkert/markdown-toc) node module.\nTo install it, make sure you have installed the dev dependencies from yarn.\nTo update the table of contents, run:\n\n```shell\nnpx markdown-toc -i README.md --bullets \"-\"\n```\n\nCopyright (c) 2007, 2010-2024 Genome Research Ltd.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsanger%2Fsequencescape","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsanger%2Fsequencescape","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsanger%2Fsequencescape/lists"}