Difference between revisions of "InstaGov"

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
Jump to navigation Jump to search
m (catg: +software/incomplete)
(notes from notebook)
Line 9: Line 9:
  
 
InstaGov will probably first be written as a plug-in for [[MediaWiki]]; it may later be available in other formats. It is entirely [[open source]], so others are free to adapt it to their own uses or add their own features.
 
InstaGov will probably first be written as a plug-in for [[MediaWiki]]; it may later be available in other formats. It is entirely [[open source]], so others are free to adapt it to their own uses or add their own features.
 +
==Development Phases==
 +
Phases in which functionality can be added:
 +
===Phase I===
 +
* create question
 +
** don't allow posting of question identical to existing one
 +
*** detect similarity, though, and confirm that new question is desired
 +
**** ask if redirect answer should be created, perhaps?
 +
* create answer(s)
 +
** support for redirect to rephrased question
 +
*** somehow prevent redirection loops?
 +
* vote on answer(s)
 +
* view results for specific question
 +
===Phase II===
 +
* list all questions (may arise naturally in Phase I)
 +
* show your status for each (created, voted)
 +
* show general stats for each (current favored answer, summed rating)
 +
* show issues needing your vote
 +
===Phase III: Proxies===
 +
* create proxy (weighted sum of other voters)
 +
* assign proxy to specific question
 +
* view your own proxy status (who is using you, and by what weights?)
 +
* ongoing question - should there be options for:
 +
** private (anonymous) proxy - nobody can see who they are using
 +
** secret proxy - existence of your proxy weighting is totally concealed
 +
===Phase IV: Categories===
 +
* create category (general or personal)
 +
* vote question into general category
 +
* rate question within personal category
 +
* assign proxy results to category
 
==Preliminary Table Design==
 
==Preliminary Table Design==
===problem===
+
===question===
<section begin=sql /><mysql>CREATE TABLE `problem` (
+
I originally had a "WhenExpires" field as a way of making a decision at a specific time, but I decided that this belongs in a separate table (something like "decision point"). Timetable functionality feels "tacked-on", and putting it in a separate table allows keeping that feature from becoming entangled with basic voting. We might want to be able to implement, say, more than one decision-point per question.
 +
<section begin=sql /><mysql>CREATE TABLE `question` (
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
   `Page` varchar(127) COMMENT "wiki page describing problem",
+
   `Page` varchar(127) COMMENT "wiki page describing question",
   `WhenCreated` DATETIME NOT NULL COMMENT "when this problem was entered",
+
   `WhenCreated` DATETIME NOT NULL COMMENT "when this question was entered",
  `WhenExpires` DATETIME DEFAULT NULL COMMENT "when this problem expires (NULL = never)",
+
   `Pos_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: default text to show at the 'yes' end of the scale",
   `Pos_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'yes' end of the scale",
+
   `Neg_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: default text to show at the 'no' end of the scale",
   `Neg_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'no' end of the scale",
 
 
   PRIMARY KEY(`ID`)
 
   PRIMARY KEY(`ID`)
 
  )
 
  )
Line 23: Line 52:
 
<section end=sql />
 
<section end=sql />
 
Not sure if we'll actually need Pos/Neg_Text; it may be just a frill.
 
Not sure if we'll actually need Pos/Neg_Text; it may be just a frill.
===solution===
+
===answer===
Any problem may have zero or more solutions. Solutions can be proposed as long as the problem is active (not expired).
+
Any question may have zero or more answers. New answers can be added at any time.
 
<section begin=sql /><mysql>CREATE TABLE `solution` (
 
<section begin=sql /><mysql>CREATE TABLE `solution` (
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
   `ID_Problem` INT NO NULL COMMENT "problem.ID of problem for which this is a solution",
+
   `ID_Question` INT NO NULL COMMENT "problem.ID of problem for which this is a solution",
 
   `Page` varchar(127) COMMENT "wiki page describing solution",
 
   `Page` varchar(127) COMMENT "wiki page describing solution",
 
   `WhenCreated` DATETIME NOT NULL COMMENT "when this solution was entered",
 
   `WhenCreated` DATETIME NOT NULL COMMENT "when this solution was entered",
 
   `WhenExpires` DATETIME DEFAULT NULL COMMENT "when this solution expires (NULL = never)",
 
   `WhenExpires` DATETIME DEFAULT NULL COMMENT "when this solution expires (NULL = never)",
 +
  `Pos_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'yes' end of the scale (overrides question default)",
 +
  `Neg_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'no' end of the scale (overrides question default)",
 
   PRIMARY KEY(`ID`)
 
   PRIMARY KEY(`ID`)
 
  )
 
  )
 
  ENGINE = MYISAM;</mysql>
 
  ENGINE = MYISAM;</mysql>
 
<section end=sql />
 
<section end=sql />
===approval===
+
===rating===
Records each user's current level of approval of each proposed solution.
+
Records each user's current rating of each proposed solution.
 
<section begin=sql /><mysql>CREATE TABLE `approval` (
 
<section begin=sql /><mysql>CREATE TABLE `approval` (
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
   `ID_User` INT COMMENT "user.ID of user who gave this rating",
+
   `ID_User` INT COMMENT "user.ID who gave this rating",
   `ID_Solution` INT NOT NULL COMMENT "solution.ID of solution for which this is a rating",
+
   `ID_Answer` INT NOT NULL COMMENT "answer.ID for which this is a rating",
   `ID_Proxy` INT DEFAULT NULL COMMENT "if this approval was proxied, records who the proxy was",
+
  `ID_Log` INT NOT NULL COMMENT "ID of log event which posted this value",
 +
   `ID_Proxy` INT DEFAULT NULL COMMENT "if this approval was proxied, records which proxy was used",
 
   `Value` INT NOT NULL COMMENT "rating value",
 
   `Value` INT NOT NULL COMMENT "rating value",
 
   `WhenDone` DATETIME NOT NULL COMMENT "when this rating was posted",
 
   `WhenDone` DATETIME NOT NULL COMMENT "when this rating was posted",
Line 50: Line 82:
 
<section end=sql />
 
<section end=sql />
 
* '''Proxy approval''' is a concept I keep coming back to. Rather than trying to prevent vote-buying by secret ballots, which cause their own problems (make recounting more difficult, inhibits discussion of personal voting record), it goes exactly the opposite direction and encourages them while ''documenting'' every occurrence for further analysis.
 
* '''Proxy approval''' is a concept I keep coming back to. Rather than trying to prevent vote-buying by secret ballots, which cause their own problems (make recounting more difficult, inhibits discussion of personal voting record), it goes exactly the opposite direction and encourages them while ''documenting'' every occurrence for further analysis.
===approval log===
+
===rating log===
Records every time a user submits an approval rating, including revisions.
+
Records every time a user submits a rating, including revisions.
<section begin=sql /><mysql>CREATE TABLE `approval_log` (
+
<section begin=sql /><mysql>CREATE TABLE `rating_log` (
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
 
   `ID` INT  NOT NULL AUTO_INCREMENT,
   `ID_Approval` INT NOT NULL COMMENT "approval.ID of approval to which this rating was applied",
+
   `ID_Answer` INT NOT NULL COMMENT "answer.ID for which this is a rating",
 +
  `ID_Rating` INT NOT NULL COMMENT "rating.ID to which this rating was applied",
 
   `ID_User` INT COMMENT "user.ID of user who gave this rating",
 
   `ID_User` INT COMMENT "user.ID of user who gave this rating",
 
   `ID_Solution` INT NOT NULL COMMENT "solution.ID of solution for which this is a rating",
 
   `ID_Solution` INT NOT NULL COMMENT "solution.ID of solution for which this is a rating",
Line 65: Line 98:
 
  ENGINE = MYISAM;</mysql>
 
  ENGINE = MYISAM;</mysql>
 
<section end=sql />
 
<section end=sql />
 +
==Abandoned==
 +
This looks like it has been superseded by the category system.
 
===escalation===
 
===escalation===
 
This is for escalating '''problems'''; '''solutions''' are escalated solely by their approval ratings rather than via a separate mechanism.
 
This is for escalating '''problems'''; '''solutions''' are escalated solely by their approval ratings rather than via a separate mechanism.

Revision as of 00:04, 17 July 2010

Overview

InstaGov is software to aid very large groups in the process of decisionmaking and evaluating a large number of items which are entered into the system collaboratively. The philosophy behind its primary purpose (collaborative governance) is discussed in great detail on Issuepedia, but there will probably be other uses for it as well.

InstaGov has two primary functions:

  • vote tallying: collecting votes from each member and presenting aggregated data showing overall sentiment towards each issue
  • issue management:
    • aggregating individual rankings to determine which issues should be propagated to more people and which should be allowed to die out
    • organizing issues into a hierarchical topic system to allow users to filter in or out areas in which they have no interest

InstaGov will probably first be written as a plug-in for MediaWiki; it may later be available in other formats. It is entirely open source, so others are free to adapt it to their own uses or add their own features.

Development Phases

Phases in which functionality can be added:

Phase I

  • create question
    • don't allow posting of question identical to existing one
      • detect similarity, though, and confirm that new question is desired
        • ask if redirect answer should be created, perhaps?
  • create answer(s)
    • support for redirect to rephrased question
      • somehow prevent redirection loops?
  • vote on answer(s)
  • view results for specific question

Phase II

  • list all questions (may arise naturally in Phase I)
  • show your status for each (created, voted)
  • show general stats for each (current favored answer, summed rating)
  • show issues needing your vote

Phase III: Proxies

  • create proxy (weighted sum of other voters)
  • assign proxy to specific question
  • view your own proxy status (who is using you, and by what weights?)
  • ongoing question - should there be options for:
    • private (anonymous) proxy - nobody can see who they are using
    • secret proxy - existence of your proxy weighting is totally concealed

Phase IV: Categories

  • create category (general or personal)
  • vote question into general category
  • rate question within personal category
  • assign proxy results to category

Preliminary Table Design

question

I originally had a "WhenExpires" field as a way of making a decision at a specific time, but I decided that this belongs in a separate table (something like "decision point"). Timetable functionality feels "tacked-on", and putting it in a separate table allows keeping that feature from becoming entangled with basic voting. We might want to be able to implement, say, more than one decision-point per question.

<mysql>CREATE TABLE `question` (

  `ID` INT  NOT NULL AUTO_INCREMENT,
  `Page` varchar(127) COMMENT "wiki page describing question",
  `WhenCreated` DATETIME NOT NULL COMMENT "when this question was entered",
  `Pos_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: default text to show at the 'yes' end of the scale",
  `Neg_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: default text to show at the 'no' end of the scale",
  PRIMARY KEY(`ID`)
)
ENGINE = MYISAM;</mysql>

Not sure if we'll actually need Pos/Neg_Text; it may be just a frill.

answer

Any question may have zero or more answers. New answers can be added at any time.

<mysql>CREATE TABLE `solution` (

  `ID` INT  NOT NULL AUTO_INCREMENT,
  `ID_Question` INT NO NULL COMMENT "problem.ID of problem for which this is a solution",
  `Page` varchar(127) COMMENT "wiki page describing solution",
  `WhenCreated` DATETIME NOT NULL COMMENT "when this solution was entered",
  `WhenExpires` DATETIME DEFAULT NULL COMMENT "when this solution expires (NULL = never)",
  `Pos_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'yes' end of the scale (overrides question default)",
  `Neg_Text` VARCHAR(63) DEFAULT NULL COMMENT "optional: text to show at the 'no' end of the scale (overrides question default)",
  PRIMARY KEY(`ID`)
)
ENGINE = MYISAM;</mysql>

rating

Records each user's current rating of each proposed solution.

<mysql>CREATE TABLE `approval` (

  `ID` INT  NOT NULL AUTO_INCREMENT,
  `ID_User` INT COMMENT "user.ID who gave this rating",
  `ID_Answer` INT NOT NULL COMMENT "answer.ID for which this is a rating",
  `ID_Log` INT NOT NULL COMMENT "ID of log event which posted this value",
  `ID_Proxy` INT DEFAULT NULL COMMENT "if this approval was proxied, records which proxy was used",
  `Value` INT NOT NULL COMMENT "rating value",
  `WhenDone` DATETIME NOT NULL COMMENT "when this rating was posted",
  `Remark` VARCHAR(255) COMMENT "comments on this rating (can include link)",
  PRIMARY KEY(`ID`)
)
ENGINE = MYISAM;</mysql>

  • Proxy approval is a concept I keep coming back to. Rather than trying to prevent vote-buying by secret ballots, which cause their own problems (make recounting more difficult, inhibits discussion of personal voting record), it goes exactly the opposite direction and encourages them while documenting every occurrence for further analysis.

rating log

Records every time a user submits a rating, including revisions.

<mysql>CREATE TABLE `rating_log` (

  `ID` INT  NOT NULL AUTO_INCREMENT,
  `ID_Answer` INT NOT NULL COMMENT "answer.ID for which this is a rating",
  `ID_Rating` INT NOT NULL COMMENT "rating.ID to which this rating was applied",
  `ID_User` INT COMMENT "user.ID of user who gave this rating",
  `ID_Solution` INT NOT NULL COMMENT "solution.ID of solution for which this is a rating",
  `ID_Proxy` INT DEFAULT NULL COMMENT "if this approval was proxied, records who the proxy was",
  `Value` INT NOT NULL COMMENT "rating value",
  `WhenDone` DATETIME NOT NULL COMMENT "when this rating was posted",
  `Remark` VARCHAR(255) COMMENT "comments on this rating (can include link or redirect)",
  PRIMARY KEY(`ID`)
)
ENGINE = MYISAM;</mysql>

Abandoned

This looks like it has been superseded by the category system.

escalation

This is for escalating problems; solutions are escalated solely by their approval ratings rather than via a separate mechanism.

<mysql>CREATE TABLE `escalation` (

  `ID`        INT NOT NULL AUTO_INCREMENT,
  `ID_User`   INT NOT NULL,
  `ID_Problem INT NOT NULL,
  `ID_Topic   INT DEFAULT NULL COMMENT "optional: this rating applies only within the given topic",
  `Rating`    INT NOT NULL     COMMENT "-10 to +10, or whatever range we end up using",
  `Remark`   VARCHAR(255)      COMMENT "comments on this rating (can include link or redirect)",
  PRIMARY KEY(`ID`)
)
ENGINE = MYISAM;</mysql>